Android自定义View实现绘制水波浪温度刻度表 |
||||||||||
+ 目录
前言之前的绘制圆环,我们了解了如何绘制想要的形状和进度的一些特点,那么此篇文章我们更近一步,绘制一个稍微复杂一点的刻度与波浪。来一起复习一下Android的绘制。 相对应的这种类型的自定义View网上并不少见,但是如果我们要做一些个性化的效果,最好还是自己绘制一份,也相对的比较容易控制效果,如果想实现上面的效果,我们一般来说分为以下几个步骤:
思路我们已经有了,下面一步一步的来实现吧。 话不多说,Lets go
1、onMeasure重新测量 之前的圆环进度,我们并没有重写 最好的办法是不管xml中设置为什么值,这里都能保证为一个正方形,要么是取宽度为准,让高度和宽度一致,要么就是宽度高度取最大值,让他们保持一致。由于我们是竖屏的应用,所以我就取宽度为准,让高度和宽度一致。 前面我们只是讲了 我们为什么要重写 onMeasure ?
一般来说我们重写的
?
widthMeasureSpec ,heightMeasureSpec 并不是真正的宽高,看名字就知道,它只是宽高测量的规格,我们通过 MeasureSpec 的一些静态方法,通过它们拿到一些信息。 static int getMode(int measureSpec):根据提供的测量值(规格)提取模式(上述三个模式之一) 测量的 Model 一共有三种
我们常用的就是 EXACTLY 和 AT_MOST ,EXACTLY 对应的就是我们设置的match_parent或者300这样的精确值,而 AT_MOST 对应的就是wrap_content。 static int getSize(int measureSpec):根据提供的测量值(规格)提取大小值(这个大小也就是我们通常所说的大小) 通过此方法就能获取控件的宽度和高度值。 static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(规格) 通过具体的宽高和model,创建对应的宽高测量规格,用于确定View的测量 而
实战: 比如我们的自定义温度刻度View,我们整个View要确保一个正方形,那么就拿到宽度,设置同样的高度,然后确定测量,流程如下:
?
这里有详细的注释,大致实现的效果如下:
2、绘制刻度 由于原本的 Canvas 内部没有绘制刻度这么一说,所以我们只能用绘制线条的方式,就是 为了了解到坐标系和方便实现,我们可以先绘制一个圆环,定位我们刻度需要绘制的位置。
?
这个圆环是之前讲到过了,就不过多赘述了,实现效果如下:
由于开始绘制的地方在左上角位置,我们要移动到圆的中心点开始绘制,也就是红色点移动到蓝色点。 我们就需要x轴和y轴做一下偏移 默认的 drawLine 都是横向绘制,我们想要实现效果图的效果,就需要旋转一下画笔www.lu0.com,也就是用到 那么旋转多少了,如果说最底部是90度,我们的起始角度是120度开始的,我们就起始旋转30度。后面每一次旋转就按照百分比来,比如我们100度的温度,那么就相当于要画100个刻度,我们就用需要绘制的角度除以100,就是每一个刻度的角度。 具体的刻度实现代码:
?
加上圆环与刻度的效果图:
3. 设置刻度动画前面的一篇我们使用的是属性动画不停的绘制从而实现进度的效果,那么这一次我们使用定时任务的方式也是可以实现动画的效果。 由于我们之前的 drawDegreeLine 方法内部控制绘制进度的变量就是 targetAngle 来控制的,所以我们通过入口方法设置温度的时候通过定时任务的方式来控制。 代码如下:
?
注册即送1000元现金券
|