本文介绍一下如何实现一个Google样式ProgressBar
这里有个相对简单的热热身先 Android 自定义控件——Simple_Loading
然后我们换种思路来重新实现一下
看图先:
分析:
根据前面链接中的重写方式,我们需要重写一个View,然后在View中通过计算,实现一个不断旋转的圆弧,我们回过头来想想,既然系统中已经有ProgressBar,并且它本身就继承子View,我们何不直接重写ProgressBar来实现了呢?带着这个问题开始探究。
ProgressBar继承自View,ProgressBar中显示出来的旋转的动画其实就是在画布上画的Drawable,具体的方法是这个
setIndeterminateDrawable()
要想ProgressBar有动态效果,Drawable本身就是动态变化着的并一直在重绘。所以我们要做的工作就是写一个动态的Drawable,想要让Drawable动态建议实现Animatable,Animatable是一个支持动画接口。
集体的动画怎么计算呢?我这里使用了属性动画来计算值变化的过程,以及使用的插值器来是动画有加速和减速效果。
动画1:mRotationAnimator 0-360度不断restart方式重复,
动画2:mSweepAppearing 20-300给弧度增加度数的动画,30-300是自己定义的变化范围,你也可以自己定义
动画3:mSweepDisappesring 300-20 给弧度减少度数的动画,与上一个正好相反。
三个动画执行的顺序如下:
动画1在一直重复不断的执行,从0-360,也就是说动画1负责转圈,当动画1开始执行时,动画2也开始执行了,动画2的值加速变化到300,也就是A-B弧长加速变长的效果,动画2在执行的时候A的速度保持原有的速度,当动画2结束之后,动画3开始执行,A-B的弧长又加速变短,同时A点的度数加速。所以动画2,3负责的是弧长由长到短,由短到长交替的工作,由长到短的时候A点的值加速增大,造成B点在变短的时候被没有倒退的现象。看起来像A一直在追B,但又追不上。
这三张图就差不多表示一个周期的 初-中-结束 的状态。虽然画的有点丑。如果这样不好理解,你还可以在放在直线上理解