公司的项目已经完成了几个了,无一例外,都有计步的功能,我的天哪,能不能有点创意,好吧,既然还要套代码,那么就把一些刁钻的UI给封装好,以后就可以直接使用提高效率了。说是刁钻,其实也并没有很夸张,只是原生控件实现不了而已。
这次的自定义View就是RoundProgressBar,顾名思义,圆形的ProgressBar而已,网上其实也有相关的博客,但我这里并不是简单的在View上面画个圆而已,我会稍微加点效果上去,尽量让它华丽点。
先上效果图:
好吧,步骤依然还是那几步:
1. 定义好attr属性,并在构造函数里将其初始化。
属性定义:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="RoundProgressBar">
<attr name="max" format="integer"/>
<attr name="progress" format="integer"/>
<attr name="count" format="integer"/>
<attr name="countWidth" format="dimension"/>
<attr name="countAngle" format="float"/>
<attr name="countColor" format="color"/>
<attr name="secondCountColor" format="color"/>
<attr name="startAngle" format="float"/>
<attr name="spacingFromAngle" format="float"/>
<attr name="spacingToAngle" format="float"/>
<attr name="isSpacing" format="boolean"/>
<attr name="animation" format="boolean"/>
<attr name="animationDuration" format="integer"/>
</declare-styleable>
</resources>
属性注释:
//进度
private int progress;
//最大进度
private int max;
//矩形小块的个数
private int count;
//小块的宽度,实际应该叫高度才对,这个width实际是画弧线的strokeWidth而已
private int countWidth;
//小块所占的角度
private float countAngle;
//小块的颜色,相当于progressColor
private int countColor;
//小块的第二颜色,即进度颜色,相当于secondProgressColor
private int secondCountColor;
//进度的起始角度,即从progress从0开始的角度
private float startAngle;
//是否挖空部分进度
private boolean isSpacing;
//挖空的开始角度
private float spacingFromAngle;
//挖空的结束角度
private float spacingToAngle;
//是否使用动画更新progress
private boolean animation;
//动画的持续时间
private long animationDuration;
2. 重写onMeasure(),处理好宽高和默认宽高。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
//主要是使view的宽高一样,以及当wrap_content时默认为100dp
int widthMode=MeasureSpec.getMode(widthMeasureSpec);
int width=MeasureSpec.getSize(wid