自定义view————码表
真的玩起了自定义view,就一直想造点什么自定义view来练练手,今天就码表来给大家讲解一下码表的撰写过程。
效果图看了,废话就不多说了,直接来上真家伙。分享过程:码表的底层背景;码表显示的当前进度;当前速度值显示;速度刻度值;对当前进度进行渐变处理
码表的底层背景
效果图可以看出,首先画给黑色的背景,这里用drawArc()来画,算出具体的RectF及其开始角度和结束角度
|
|
mBackgroundPaint的相关设置可以去设置你自己想要的效果
码表的当前进度
码表的底层背景说完了,接下来就来介绍一下码表的时时刻刻变化的当前进度,其实和码表的底层背景的绘制是一样的,只不过就是角度时变化的
首先算出当前速度占这个码表的角度是多少,我这里的最大角度是240,最高速度是300,当时速度占的总角度=当前速度/300*240
角度算好了就是画了
|
|
到这一步为止,码表就能时时的根据速度来动态变化了,就下来就是来给这个码表加些花了
当前速度值显示
速度值动态显示用drawText()就能显示,但是这样的设置,位置不是居中,因此我们需要计算出当前速度值文字显示的宽高,然后计算准确的位置来达到好的展示效果
|
|
到了这一步,去看看车子里的仪表盘差了速度刻度值,不行,这个花也得加上去
速度刻度值显示
我这里的最大速度是300,我用50为一个大节点,共分为0、50、100、150、200、250、300,0-50之间有小刻度值,画线drawLine(),画刻度值drawText(),再结合rotate()来达到心中的效果
|
|
速度刻度值就出来了,需要注意
- canvas.rotate(60)是为了保证0刻度是和进度是从同一个位置开始的;
- canvas.rotate(360 / count, 0f, 0f); //旋转画纸保证刻度线的位置;
- 文字宽高的计算上面已经提到过了
- canvas.rotate(180, 0, radius);是为了保证文字不是倒立的,需另外注意canvas.save();,canvas.restore();保持和恢复方法
大致完整的功能是已经出来了,接下来就是给进度条的变化加一个大大的彩花
当前进度渐变处理
进度渐变处理,对mProgressPaint(当前进度条的画笔)进行属性的设置达到彩色渐变效果,setShader()方法结合SweepGradient
|
|
完整代码
|
|
以上还有很多可优化及其可提取出来的属性设置,可根据自己项目需求进行修改