为了实现一个如下图红色方框所示的控件,系统自带控件并不能满足要求,因此需要继承View重新画一个这样的控件
分析此控件发现分为3部分,中间的一列横线和左右两个标签
中间的部分好绘制,通过循环调用canvas的drawLine方法即可
然后分析左右两边的两个标签,因为左右两个是一样的,因此只分析左边的
外围形状是一个圆环被拉出来了一个三角形,这个三角形是等边三角形,等边三角形的上边顶点设为tt,下边顶点设为bb,右边顶点设为rr
tt和bb与圆心相连构成一个角度,这个角度是30度
根据上边已知条件,使用三角函数运算可以计算出等边三角形的边长
圆弧加上等边三角形的两条边构成了一个闭合路径,因此使用canvas的drawPath绘制路径
路径的起点设为等边三角形的右顶点rr,根据三角函数关系可以计算出等边三角形下顶点bb的坐标
从bb开始计算圆弧路径,起始角度为15度,扫过角度为360度减去30度
之后把路径闭合即可,调用path的close()方法
圆弧位置的确定需要一个外接正方形,已知等边三角形的三个顶点可以很方便求出圆的最右边点的坐标
以圆的最右边坐标计算外接正方形的左上顶点坐标和右下顶点坐标
最后绘制文字即可
测试效果如下:
测试代码:
final Random random=new Random(); final RankBar bar=(RankBar)findViewById(R.id.rank_bar