android自定义view 模仿win10进度条
本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。
PS:有朋友反映动画无法播放,那是因为PathMeasure.getLength()只在KITKAT以上版本有效,而对于以下版本一定要关闭硬件加速才有效。
先上预览图:
流程
- 1.一个匀速圆周运动的点
- 2.多个匀速圆周运动的点
- 3.多个圆周运动的点,速度由快到慢
- 4.点与点之间的间距线性减少,动画的最后合为一个点
- 5.为了让动画看起来更加流畅,需要在动画即将结束的时候手动绘制点
核心控件
- PathMeasure:截取Path中的一部分并显示
- ValueAnimator:完成动画从初始值平滑的过度到结束值的效果,同时还负责管理动画的播放次数、播放模式、以及对动画设置监听器等
流程一
思路
- 先用path画一个圆
- ValueAnimator设置为0f-1f的平滑
- 用PathMeasure根据ValueAnimator返回的值截取path上的一个点
private Paint mPaint;
private Path mPath;
private PathMeasure mPathMeasure;
private int mWidth,mHeight;
private ValueAnimator valueAnimator;
//用这个来接受ValueAnimator的返回值,代表整个动画的进度
private float t;
- 初始化画笔
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(15);
mPaint.setColor(Color.WHITE);
//设置画笔为园笔
mPaint.setStrokeCap(Paint.Cap.ROUND);
//抗锯齿
mPaint.setAntiAlias(true);
- 初始化Path和mPathMeasure
这里角度不能选360,否则会测量失误,具体原因和android的内部优化有关
mPath = new Path();
RectF rect = new RectF(-150,-150,150,150);
mPath.addArc(rect,-90,359.9f);
mPathMeasure = new PathMeasure(mPath,false);
- 初始化ValueAnimator
valueAnimator = ValueAnimator.ofFloat(0f,1f).setDuration(3000);
valueAnimator.setRepeatCount(-1);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
t = (float) animation.getAnimatedValue();
invalidate();
}
});
这里的ValueAnimator设置的是一个时长3秒的动画,再这3秒中,ValueAnimator会返回一个由0f-1f平滑的数字
ValueAnimator.ofFloat(0f,1f).setDuration(3000)
在这里我们用t来接受返回值,同时刷新视图
t = (float) animation.getAnimatedValue();
invalidate();
这里可以看出t的值,有0到1