1. 前言
恰好这段时间也在看【HenCoder】的自定义view教程(里面写得非常非常详细,也有相应的习题等等),所以就趁热打铁,熟悉一下学习的知识。
那下面来看一下我自己模仿的效果
静态图
是不是模仿得有几分相似,哈哈~,下面来看一下我实现的思路吧
2. 分析
这个动画实现起来并不复杂,掌握几个基本的自定义view的方法即可。
实现的思路分为选中状态和未选中状态
2.1 未选中的状态
未选中的状态很简单,需要绘制的有两个图形
圆环
勾
2.2 选中的状态
绘制选中的动画稍微复杂一点,主要包括
1. 绘制圆环进度条
这个简单,直接使用drawArc()即可实现
2 . 绘制向圆心收缩的动画
这个一开始的时候想用drawArc()加上设置画笔的宽度strokeWidth来实现,不过改变的宽度是往外扩张的,所以这个想法果断放弃。
之后,我的想法是这样的,看下图
我就打算先绘制一个黄色的背景,然后在这个图层上面绘制一个白色的圆,半径不断的缩小,直至为0,这就反过来得到了一个向中心收缩的动画,这可以叫逆转思维吧,最近看的一本书里面说到有时候反过来思考也许会有不一样的效果。
3 . 显示勾出来
关于这个√,我在 上搜了一波,也没有明确的指明怎么画法才是标准的,所以这里可以随意发挥,自己觉得好看就行。这里直接可以使用drawLine()可以一步搞定。
4 . 最后是圆环放大再回弹的效果
放大回弹可以使用drawArc(),配合改变画笔的宽度来实现即可
3.具体实现
3.1 确定进度圆环和钩的位置
经过上面分析,无论是选中状态还是未选中状态,进度圆环和钩的位置是不变的,所以我们先来确定圆环的位置和钩的位置
@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); ... //设置圆圈的外切矩形,radius是圆的半径,centerX,centerY是控件中心的坐标 mRectF.set(centerX - radius, centerY - radius, centerX + radius, centerY + radius); //设置打钩的几个点坐标(具体坐标点的位置不用怎么理会,自己定一个就好,没有统一的标准) //画一个√,需要确定3个坐标点的位置 //所以这里我先用一个float数组来记录3个坐标点的位置, //最后在onDraw()的时候使用canvas.drawLines(mPoints, mPaintTick)来画出来 //其中这里mPoint[0]~mPoint[3]是确定第一条线""的两个坐标点位置 //mPoint[4]~mPoint[7]是确定第二条线""/""的两个坐标点位置 mPoints[0] = centerX - tickRadius + tickRadiusOffset; mPoints[1] = (float) centerY; mPoints[2] = centerX - tickRadius / 2 + tickRadiusOffset; mPoints[3] = centerY + tickRadius / 2; mPoints[4] = centerX - tickRadius / 2 + tickRadiusOffset; mPoints[5] = centerY + tickRadius / 2; mPoints[6] = centerX + tickRadius * 2 / 4 + tickRadiusOffset; mPoints[7] = centerY - tickRadius * 2 / 4;}
3.2 定义变量,标记状态
既然分选中状态和未选中状态,那个绘制过程中,就必须判断当前究竟是绘制未选中的呢还是选中了的呢。
因此在这里,我定义了一个变量isChecked
//是否被点亮 private boolean isChecked = false; //暴露外部接口,改变绘制状态 public void setChecked(boolean checked) { if (this.isChecked != checked) { isChecked = checked; reset(); }}
3.3 绘制未选中状态
绘制过程中那些画笔就不详细说了,一开始初始化画笔最后绘制的时候调用即可
@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); if (!isChecked) { //绘制圆环,mRectF就是之前确定的外切矩形 //因为是静态的,所以设置扫过的角度为360度 canvas.drawArc(mRectF声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!