开启成长之旅!这是我参加「日新计划 2 月更文挑战」的第 13 天,点击检查活动详情
楔子
昨天咱们刚刚看了一下Kotlin高阶函数(安卓开发之Kotlin学习——初遇高阶函数 – ()),今天理应去持续研讨与深化,但由于作者工作一天没去补充高阶函数知识,无法填坑,所以决定将后续改到周日。
本篇咱们来看看Kotlin语言版的自定义View,之前一向看到Kotlin的自定义View就不想做。但在这段时间看了一些关于Kotlin自定义View的文章后,我感觉能够稍微写一下了。
之前谈论区的小伙伴好像还想看画动画,假如用Java我似乎没有问题的,但在家里我主要坚持用Kotlin来写安卓,所以Kotlin面对=向对象方面的语法不熟让我一向对Kotlin的类的结构函数有点不适应,而承继View后的结构我之前没看他人写的我自己有点无从下手,更甭说去draw了,而这次用自定义View后我很快就会去看看动画如何做,然后再出文章来共享。
自定义View
言归正传,咱们还是持续看如何写自定义View。
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去完结一些动画(期望没有什么语法妨碍,明明说会Java开发安卓换Kotlin很容易,可能还是作者实践少了),比如之前我用CSS画的爱心作用(情人节专场——爱心动画 – ()),咱们理论上在安卓上也能够完结相同作用,先让作者看看应该用哪种动画形式,后边完结再共享出来。