本文实例为大家分享了android自定义view实现圆环进度条的具体代码,供大家参考,具体内容如下
效果展示
动画效果
view实现
1.底层圆环是灰色背景
2.上层圆环是红色背景
3.使用动画画一条弧线
view
/**
* 圆环进度条
*/
public class roundprogressbar extends view {
//绘制矩形区域
private rectf rectf;
//起始角度
private float startangle;
//扫过角度
private float sweepangle;
//画笔
private paint paint;
//默认控件大小
private int defoutsize;
//默认线条宽度
private int defoutline;
private int strokewidth;
private pointf pointf = new pointf();
public roundprogressbar(context context) {
super(context);
initdata();
}
public roundprogressbar(context context, attributeset attrs) {
super(context, attrs);
initdata();
}
/**
* 参数初始化
*/
private void initdata() {
startangle = 0;
sweepangle = 0;
defoutsize = 400;
defoutline = 20;
strokewidth = 20;
rectf = new rectf();
//抗锯齿画笔
paint = new paint(paint.anti_alias_flag);
paint.setcolor(color.gray);
paint.setstrokewidth(defoutline);
//笔帽样式
paint.setstrokecap(paint.cap.round);
paint.setstyle(paint.style.stroke);
}
/**
* xml -----> 提供可绘制位置
*
* @param widthmeasurespec 宽
* @param heightmeasurespec 高
*/
@override
protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
super.onmeasure(widthmeasurespec, heightmeasurespec);
setmeasureddimension(defoutsize, defoutsize);
}
/**
* 当大小时改变回调
*
* @param w
* @param h
* @param oldw
* @param oldh
*/
@override
protected void onsizechanged(int w, int h, int oldw, int oldh) {
super.onsizechanged(w, h, oldw, oldh);
pointf.x = w >> 1;
pointf.y = h >> 1;
rectf.top = strokewidth >> 1;
rectf.bottom = h - (strokewidth >> 1);
rectf.left = strokewidth >> 1;
rectf.right = w - (strokewidth >> 1);
}
/**
* 绘制
*
* @param canvas
*/
@override
protected void ondraw(canvas canvas) {
super.ondraw(canvas);
//画布旋转
paint.setcolor(color.gray);
canvas.rotate(135, pointf.x, pointf.y);
//绘制圆环
canvas.drawarc(rectf, startangle, 270, false, paint);
paint.setcolor(color.red);
canvas.drawarc(rectf, startangle, sweepangle, false, paint);
}
public void setprogress(float index) {
//防止数值越界
if (index > 1 || index < 0) {
return;
}
valueanimator valueanimator = valueanimator.offloat(0, index);
valueanimator.setduration(3000);
valueanimator.setinterpolator(new decelerateinterpolator());
valueanimator.addupdatelistener(new valueanimator.animatorupdatelistener() {
@override
public void onanimationupdate(valueanimator animation) {
sweepangle = (float) animation.getanimatedvalue() * 270;
//重写绘制
invalidate();
}
});
valueanimator.start();
}
}
最后在activity中使用setprogress方法赋值进度条的进度来实现效果
progressview.setprogress(0.8f);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。