kotllin自定义view_Android 使用Kotlin自定义View的方法教程

本文介绍了如何使用Kotlin在Android中创建一个自定义饼图View,对比了Kotlin与Java在编写自定义View时的差异,并提供了完整的Kotlin代码示例,展示了Kotlin在简化代码方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

随着google宣布kotlin作为官方开发语言,在Android中使用kotlin的趋势也越来越明显,最近被kotlin的文章轰炸了,所以决定上手试一下,试过之后,感觉靠它灵简直有魔性。特别是一句话写出一个复杂的循环的时候,简直被惊呆。而且使用AS,Java代码可以直接转成Kotlin。

效果图如下:

首先是这次自定义View的效果图,是一张饼图。如果是用java写的话也就几十行,觉得换成Kotlin的话可能会更少。

示例代码

主要的功能是可以任设定数据的个数,我这里是4个数据,可以任意设定每个数据的颜色。

#####首先上Kotlin代码#####

package top.greendami.mykotlinapp

import android.content.Context

import android.graphics.*

import android.util.AttributeSet

import android.view.View

/**

* Created by GreendaMi on 2017/4/10.

*/

class PPCircle : View {

var mDatas = ArrayList()

var mColors = ArrayList(4)

var mPaint: Paint = Paint()

constructor(mContext: Context) : super(mContext) {

val context = mContext

}

constructor(mContext: Context, mAttributeSet: AttributeSet) : super(mContext, mAttributeSet) {

initPaint()

val context = mContext

}

fun initPaint() {

mPaint.isAntiAlias = true

mPaint.style = Paint.Style.FILL_AND_STROKE

mPaint.color = 0xff44b391.toInt()

}

//长宽一致

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec)

val widthSpecSize = View.MeasureSpec.getSize(widthMeasureSpec)

val heightSpecSize = View.MeasureSpec.getSize(heightMeasureSpec)

val mLayoutSize = Math.min(widthSpecSize, heightSpecSize)

setMeasuredDimension(mLayoutSize, mLayoutSize)

}

/**

* 设置数据

*/

fun setData(data: ArrayList, colors: ArrayList) {

mDatas = data

mColors = colors

invalidate()

}

override fun onDraw(canvas: Canvas?) {

super.onDraw(canvas)

if (mDatas.size == 0) {

return

}

//切掉圆心

var mPath = Path()

mPath.addCircle(width / 2f, height / 2f, width / 2f * 0.4f,Path.Direction.CW)

mPath.close()

canvas?.clipPath(mPath, Region.Op.XOR)

var total = 0f

//此处亮点

mDatas.forEach { total += it }

var rf = RectF(0f, 0f, width.toFloat(), height.toFloat())

var startAngle = -90f//起点

var i = 0

mDatas.forEach {

mPaint.color = mColors[i]

var sweepAngle = it * 360 / total

canvas?.drawArc(rf, startAngle, sweepAngle, true, mPaint)

startAngle += sweepAngle

i++

}

}

}

设置数据

package top.greendami.mykotlinapp

import android.os.Bundle

import android.support.v7.app.AppCompatActivity

import kotlinx.android.synthetic.main.activity_main2.*

class Main2Activity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main2)

var mDatas = ArrayList()

mDatas.add(1f)

mDatas.add(2f)

mDatas.add(4f)

mDatas.add(2f)

var mColors = ArrayList()

mColors.add(0xff83ccd2.toInt())

mColors.add(0xffc0e1ce.toInt())

mColors.add(0xfffac55e.toInt())

mColors.add(0xffef805f.toInt())

ppCircle.setData(mDatas,mColors)

}

}

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" tools:context="top.greendami.mykotlinapp.Main2Activity">

android:id="@+id/ppCircle"

android:layout_width="300dp"

android:layout_height="300dp" app:layout_constraintBottom_toBottomOf="parent"

android:layout_marginBottom="8dp"

android:layout_marginRight="8dp"

app:layout_constraintRight_toRightOf="parent"

app:layout_constraintTop_toTopOf="parent"

android:layout_marginTop="8dp"

android:layout_marginLeft="8dp"

app:layout_constraintLeft_toLeftOf="parent" />

#####相同功能Java代码#####

package com.allrun.arsmartelevatorformanager.widget;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.RectF;

import android.graphics.Region;

import android.support.annotation.Nullable;

import android.util.AttributeSet;

import android.view.View;

import java.util.ArrayList;

import java.util.List;

/**

* Created by GreendaMi on 2017/4/11.

*/

public class PPCircle extends View {

Context mContext;

List mData = new ArrayList();//数据

List mColors = new ArrayList();//数据对应的颜色

Paint mPaint = new Paint();

public PPCircle(Context context) {

super(context);

}

public PPCircle(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

mContext = context;

initPaint();

}

private void initPaint() {

mPaint.setAntiAlias(true);

mPaint.setStyle(Paint.Style.FILL_AND_STROKE);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int widthSpecSize = View.MeasureSpec.getSize(widthMeasureSpec);

int heightSpecSize = View.MeasureSpec.getSize(heightMeasureSpec);

int mLayoutSize = Math.min(widthSpecSize, heightSpecSize);

setMeasuredDimension(mLayoutSize, mLayoutSize);

}

public void setData(List mData, List mColors) {

this.mData = mData;

this.mColors = mColors;

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (mData.size() == 0) {

return;

}

//切掉圆心

Path mPath =new Path();

mPath.addCircle(getWidth()/2,getWidth()/2,getWidth()/2* 0.4f ,Path.Direction.CW);

canvas.clipPath(mPath, Region.Op.XOR);

float total = 0;

for(float temp : mData){

total = total + temp;

}

RectF rf = new RectF(0f, 0f, getWidth(), getHeight());

float startAngle = -90f;//起点

int i = 0;

for(float temp : mData){

mPaint.setColor(mColors.get(i));

float sweepAngle = temp * 360 / total;

canvas.drawArc(rf, startAngle, sweepAngle, true, mPaint);

startAngle += sweepAngle;

i++;

}

}

}

说说Kotlin和Java感觉差异比较大的地方。首先是变量的生命,Kotlin声明时必须赋值或者初始化,java则不用,开始有点不习惯。Kotlin不需要分号结尾,Kotlin的循环用起来简直爽YY。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值