您的位置:首页 > 移动开发 > Android开发

手把手带你画一个 时尚仪表盘 Android 自定义View

2016-01-14 15:33 597 查看
拿到美工效果图,咱们程序员就得画得一模一样。 为了不被老板喷,只能多练啊。

听说你觉得前面几篇都so easy,那今天就带你做个相对比较复杂的。

今天的效果图如下(左边是ui图 右边是实现图):



自我感觉总体效果还不错,至少大概画得一样了。上一个动态图:



其实这个效果实现起来也不是很难,就是计算坐标,弧度之类的可能会比较麻烦,这里分享写这个其中一张手稿,请无视掉很丑的字,其实做自定义view 还是要在纸上多画。所以希望大家也能这么画画,思路会很顺。



好的了,废话不多说,快开始。

首先自定义属性 构造函数,测量什么的 你肯定已经很熟练 直接贴代码了,注释写的很清楚

?
自定义属性attr.xml

?
之后来重头戏,也就是绘制。就像画画一样,再复杂的view也是一笔一笔画出来的。所以我们把这个view分解。

大概分解成如下:1.最外面的弧 2.里面的粗弧 3.中间小圆 4.最小的圆 5.刻度 6.指针 7.矩形 8.文字

相信让你分开画一定难不倒你。那组合在一起 就是这个view啦。下面开始我们的ondraw()

按照这个分解来:

1.绘制最外面的弧 这里需要注意的一点是,如果想让这个圆在view里 记得减去画笔宽度的一半 因为半径是从圆心到画笔宽度的中间算的,所以这里画弧的矩形是 new RectF(strokeWidth, strokeWidth, mWidth - strokeWidth, mHeight - strokeWidth)

?
画出来是这样的效果。



2.绘制里面的粗弧,这里比较麻烦的就是需要分为四段,看图:



因为大圆和里面粗弧的长短不一致,这里使用百分比来计算 所以会造成指针偏差,那么这里把 1、2两个部分固定来画,然后是3 充满的部分,用百分比来计算需要画多少度,最后是4 空白的部分。

首先把粗弧的矩形画出来,这里固定了比大弧半径少50(这里其实可以改进,你可以改成动态的让他更灵活),然后计算出百分比。

?
接下来绘制1弧,先算出fill充满部分的度数,因为是突出的,所以如果百分比为0,突出左端为白色 如果不为零,则和充满颜色统一。

?
然后绘制2弧 也就是fill充满的弧,

?
接下来是3弧,也就是empty未充满的弧,是白色的

?
最后,画出右边突出的4弧, 如果百分比为100 那么和充满的颜色一致,否则为白色

?
这样粗弧也就画完了 来看看效果,就画了两条弧线(实际是5条),就成型了。



3.中间的小圆外圈,他的圆心不用多说 是整个view的中心

?
4.绘制内圆,圆心一样的,半径和画笔粗度改变一下

?


5.刻度 刻度处理起来可能比较麻烦,用三角函数算坐标啊 循环画出来。。 这里提供一种比较简单的方法:旋转画布。

首先引入一个概念,什么叫旋转画布呢,就是把你的画布旋转。。经过测试,旋转以后,整个坐标轴都会对应旋转,一张图举例说明下。



大概就是这个意思,画布旋转之后 坐标系也就旋转了,但是原来的图像还在,所以说你比如这个点 x,y旋转前在这个位置, 那么旋转后就是另外一个位置了,但是他们的坐标是相同的。 所以刻度也可以考这种方法画。我们只要画出最顶端的刻度 然后旋转就可以了。



绘制第一段刻度, 然后总共是250的弧度 计算出每个刻度的度数 用250除以刻度数mTikeCount,就是每次旋转的度数。接下来把画布逐步旋转,按照原坐标绘制,即可绘制出右半部分刻度。 注意:为了让之后的绘制正常,务必把画布转回原来的位置

?


左半部分同理,需要改变的度数为负 就好了

?


6.指针 指针的绘制和刻度相似,先算出来百分比所占的度数 然后根据 是否大于50%来旋转画布。

指针的起终点是 总view高度的一半 粗弧矩形的一半 加上小圆,前面坐标讲解了那么,这个也一样,自己拿起笔算一算。

注意这里画布旋转我通过计算得出一个公式 250 * percent - 250/2。

如果小于50% 则为负 如果大于50%则为正,然后进行旋转。

切忌最后一定要将画布转回来。

?


接下来就是画矩形和文字。没什么好说的了,坐标也是X周围mWidth/2 y轴自己根据圆心微调一个距离

?
这样完成了整个view的绘制。



下面要做的就是为了方便使用者,提供一些设置属性的方法。

?
大功告成!!!一个看似复杂的view 经过我们一步一步绘制遍完成了。

其实技术的养成也是这样,只要一步一步脚踏实地的去练习,我相信总有一天我能成为大神,并且找到心仪的工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: