开启成长之旅!这是我参加「日新计划 2 月更文挑战」的第 13 天,点击检查活动详情

楔子

昨天咱们刚刚看了一下Kotlin高阶函数(安卓开发之Kotlin学习——初遇高阶函数 – ()),今天理应去持续研讨与深化,但由于作者工作一天没去补充高阶函数知识,无法填坑,所以决定将后续改到周日。

本篇咱们来看看Kotlin语言版的自定义View,之前一向看到Kotlin的自定义View就不想做。但在这段时间看了一些关于Kotlin自定义View的文章后,我感觉能够稍微写一下了。

之前谈论区的小伙伴好像还想看画动画,假如用Java我似乎没有问题的,但在家里我主要坚持用Kotlin来写安卓,所以Kotlin面对=向对象方面的语法不熟让我一向对Kotlin的类的结构函数有点不适应,而承继View后的结构我之前没看他人写的我自己有点无从下手,更甭说去draw了,而这次用自定义View后我很快就会去看看动画如何做,然后再出文章来共享。

自定义View

言归正传,咱们还是持续看如何写自定义View。

View类的结构函数:

画个爱心——使用Kotlin自定义View

在Java中,我很熟练了,之前工作开发中已经写了不少自定义控件,从自定义进度条Progress到自定义倍数选择器然后到最近的摇杆控件,只要你多看看他人怎样去完结自定义的,然后把自己想要的控件给画好就成功多半,下面咱们采用path途径draw办法去画一个爱心

Java完结对比

下面咱们先看看Java的自定义View:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
public class TestViewJava extends View {
    public TestViewJava(Context context) {
        super(context, null);
        init();
    }
    public TestViewJava(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
        init();
    }
    public TestViewJava(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private Paint paint;
    private Path path;
    void init() {
        paint = new Paint();
        path = new Path();
        //抗锯齿
        paint.setAntiAlias(true);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//        paint.setColor(getResources().getColor(R.color.black));
//        paint.setTextSize(36);
//        canvas.drawText("Text Java", 200, 200, paint);
        paint.setColor(getResources().getColor(R.color.red));
//        canvas.drawCircle(50,50, 20, paint);
        //运用途径画爱心
        //弧形
        // startAngle 是弧形的起始视点(x 轴的正向,即正右的方向,是 0 度的方位;顺时针为正视点,逆时针为负视点)
        // sweepAngle 是弧形划过的视点
        path.addArc(200, 200, 400, 400, -225, 225);
        //画弧形
        //forceMoveTo :是否留下移动的痕迹 true-无痕迹,false-留下痕迹
        path.arcTo(400, 200, 600, 400, -180, 225, false);
        // 从当时方位向方针方位画一条直线(当时方位,即最终一次调用画 Path 的办法的终点方位,初始值为原点 (0, 0))
        // x 和 y 是方针方位的坐标
        // 参数是肯定坐标
        path.lineTo(400, 542);
        canvas.drawPath(path, paint);
    }
}

完结Kotlin自定义View

再看Kotlin的完结:

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.util.AttributeSet
import android.view.View
class TestView : View {
    private var mPaint: Paint? = null
    private var path: Path? = null
    constructor(context : Context) : super(context, null) {
        init()
    }
    constructor(context: Context, attrs: AttributeSet?) : super(context, null, 0) {
        init()
    }
    constructor(context: Context, attrs: AttributeSet?, def : Int) : super(context, attrs, def) {
        init()
    }
    private fun init() {
        mPaint = Paint()
        path = Path()
        //抗锯齿
        mPaint!!.isAntiAlias = true
    }
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        //运用途径画爱心
        path!!.addArc(200f, 200f, 400f, 400f, -225f, 225f)
        path!!.arcTo(400f, 200f, 600f, 400f, -180f, 225f, false)
        path!!.lineTo(400f, 542f)
        canvas!!.drawPath(path!!, mPaint!!)
    }
}

对比代码后,咱们能够发现其实最主要就是结构函数的完结办法不一样,在Kotlin中咱们运用关键字constructor结构,而Java中咱们是运用与类名相同的办法(结构函数),而Koltin还多了空安全,且不用去new对象。 2/18勘正 上面的代码,昨晚作者在Activity中企图获取布局中增加的上述代码的id,然后出现空指针闪退的情况,所以代码做下面的调整:

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.util.AttributeSet
import android.view.View
class BallView : View {
    private var mPaint : Paint? = null
    private var path : Path? = null
    constructor(context : Context) : this(context, null)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        initPaint()
    }
    private fun initPaint() {
        mPaint = Paint()
        path = Path()
        //抗锯齿
        mPaint!!.isAntiAlias = true
        //防抖动
        mPaint!!.isDither = true
    }
    override fun draw(canvas: Canvas?) {
        super.draw(canvas)
        mPaint!!.color = Color.RED
        //运用途径画爱心
        path!!.addArc(200f, 200f, 400f, 400f, -225f, 225f)
        path!!.arcTo(400f, 200f, 600f, 400f, -180f, 225f, false)
        path!!.lineTo(400f, 542f)
        canvas!!.drawPath(path!!, mPaint!!)
    }
}

咱们增加了Paint的防抖动办法调用,然后主要是把次结构函数前两个的super改为this,最终指向最终一个结构,只需要在最终一个结构写init()初始化即可,这样放入布局加id后在Activity中可正常调用。

总体而言,写起来两者还是挺相似的,这也告诉作者只有着手才知道难度。

完结作用预览

咱们将两个自定义View控件都放入布局,假如没有错误,咱们在预览或者运行完结程序后就能看到作用图,如下:

画个爱心——使用Kotlin自定义View

结尾

完结了Kotlin的自定义View后,我也能够尝试用Kotlin去完结一些动画(期望没有什么语法妨碍,明明说会Java开发安卓换Kotlin很容易,可能还是作者实践少了),比如之前我用CSS画的爱心作用(情人节专场——爱心动画 – ()),咱们理论上在安卓上也能够完结相同作用,先让作者看看应该用哪种动画形式,后边完结再共享出来。