我们在自定义一个控件的时候首先要分析它的结构
可以看出一共有四部分四个圆弧,两个线条圆弧两个点状圆弧绘画的步骤分别是
1.从0点开始,角度从360度到0度的一个线條圆
2.一小段一小段的弧线然后让画布旋转绘制成圆弧。
3.从0点开始角度从0-360度的一个线条圆
4.一小段一小段的弧线然后让画布旋转绘制成圆弧。
首先我们自定义一个控件需要我们先分析它的属性,然后定义自定义属性:
- mStartColor 开始的颜色(因为是渐变样式)
- mEndColor 结束的颜色(因为是渐變样式)
我们可以看到在获取玩xml的自定义属性以后调用了recycle()这个方法,那么为什么要调用这个方法
首先我们来看一下typedArray的创建
可以看絀来并不是实例化出来的,是调用了TypedArray的静态方法来获得typedArray的实例的但是到这里还是没能解决我们的问题,那就接着往下看TypedArray.obtain的方法:
我们发現内部是一个单利的形式发现typedArray这个实例是从线程池里面获取的。这样我们是不是就知道了其实程序在运行时维护了一个 TypedArray的池,需要的時候我们会向线程池请求实例用完后调用recycle()方法释放这个实例,从而让其可以被复用而不是重新创建,这样就减少了系统频繁创建array导致oom。
从效果图中可以看出来整个线条圆是分为渐变的颜色
如果想画出渐变的效果我们可以用这个类 Shader,它有五个子类
- LinearGradient :线性渐变着色器(我们要用到这个)
- x0表示渐变的起始点x坐标
- y0表示渐变的起始点y坐标
- x1表示渐变的终点x坐标
- y1表示渐变的终点y坐标
- color0表示渐变开始颜色
- color1表示渐变結束颜色
现在我们的所有准备活动都准备完毕那就开始画吧上核心代码
A:第一个圆弧从0点开始,角度从360度到0度
B:一小段弧线然后让画布旋轉360度
C::第一个圆弧从0点开始,角度从度到0度360度
D:一小段弧线,然后让画布旋转360度
E:刷新数据进行更新绘制