标签:duration view blog 就是 视图 off 技术干货 strong png
本文由zhangml0522投稿。zhangml0522的博客地址:
http://blog.csdn.net/zhangml0522
先上预览图:
流程
1.一个匀速圆周运动的点
2.多个匀速圆周运动的点
3.多个圆周运动的点,速度由快到慢
4.点与点之间的间距线性减少,动画的最后合为一个点
核心控件
PathMeasure:截取Path中的一部分并显示
1 一个匀速圆周运动的点
先用path画一个圆
ValueAnimator设置为0f-1f的平滑
private Paint mPaint;
private Path mPath;
private PathMeasure mPathMeasure;
private int mWidth,mHeight;
private ValueAnimator valueAnimator;
//用这个来接受ValueAnimator的返回值,代表整个动画的进度
private float t;
初始化画笔

初始化Path和mPathMeasure
这里角度不能选360,否则会测量失误,具体原因和android的内部优化有关

* 初始化ValueAnimator

这里的ValueAnimator设置的是一个时长3秒的动画,再这3秒中,ValueAnimator会返回一个由0f-1f平滑的数字
ValueAnimator.ofFloat(0f,1f).setDuration(3000)
在这里我们用t来接受返回值,同时刷新视图
t = (float) animation.getAnimatedValue();
invalidate();

这里可以看出t的值,有0到1,这里就可以把t理解为我们这个动画的进度
* 开始绘制

* 结果图

**2 多个匀速圆周运动的点**
我们设置让t每间隔0.05就画一个点,总共画4个点,注意这里getSegment()的最后一个要设置为true来保证画出来的是多个点而不是一条线

结果图

**3 速度由快到慢**
我们先绘制出路程-时间的函数图像

函数为y = -x*x + 2*x,当x=1时,y=mPathMeasure.getLength();
设s = mPathMeasure.getLength();
最终我们套用函数:y = -s*x*x+2*s*x;
这里的Y轴代表的是path的长度,X轴对应时间
所以把流程二中的y = s*x改成y = -s*x*x+2*s*x即可

结果图

**4 动画的最后合为一个点**
虽然流程3中点与点的间距已经开始减少,不过这只是因为速度不同间距才改变的,我们的目的是让这些点到最后合并为1个点,也就是说开始的时候每个点的X间距0.05,结束的时候要让他们的X相同
目前点之间X的间距函数如下:

我们最后要让当X=1时,他们的Y值相等,而且他们X的间距由0.05线性平滑到0

看函数图像已经很清楚了,修改后代码如下:

结果图

**5 完美的补刀**
这里已经完成了99.9%了,但细心的同学会发现,进度条每次转动一圈聚成一个点后都会闪一下,这是因为重新开始动画刷新视图的原因,这里的补救方法就是我们在动画快结束的时候手动画一个点
if(t>=0.95){
canvas.drawPoint(0,-150,mPaint);
}
这样我们就完成了这个进度条

掘金是一个高质量的技术社区,从 RxJava 到 React Native,性能优化到优秀开源库,让你不错过 Android 开发的每一个技术干货。长按图片二维码识别或者各大应用市场搜索「掘金」,技术干货尽在掌握中。

如果你有好的文章想和大家分享,欢迎投稿,直接向我投递文章链接即可。
欢迎长按下图->识别图中二维码或者扫一扫关注我的公众号:

阅读原文
标签:duration view blog 就是 视图 off 技术干货 strong png
原文地址:https://blog.51cto.com/15064646/2575285