提纲:文章写了什么?
- 什么是属性动画?
- 属性动画相关接口及常用类
- ValueAnimator
- ObjectAnimator
- 估值器
- 差值器
属性动画,顾名思义就是:沿着一定的时间顺序,通过改变View的属性,从而得到的动画的效果。引入属性动画最大的作用就是为了“眼见为实”,对于ViewAnimation,动画的移动和缩放并没有真正的改变控件的位置和热区,而属性动画则可以做到这一点。
Interface:
Class:
这里要着重记录的是这几个类:
- ValueAnimator 属性动画的核心类
- ObjectAnimator 继承 ValueAnimator 对ValueAnimator进行了一层封装
- AnimatorSet 可以同时运行一组动画
- PropertyValuesHolder 他代表一个在动画运行中需要过度到的值。
- TypeEvaluator 实现此接口的实例,将决定AnimatorUpdateListener接收到的值。
这里有必要说明一下,上面对动画的描述是“运行”,而不是“播放”。因为属性动画的本质是在指定的时间内于指定的值之间过度。这就意味着他并不仅限于View控件。举例来说,他可以是一个不断运动的看不见的点,而你在需要的时候可以通过回调知道在某一时间点对应的值,从而进行canvas的绘制。
ValueAnimator
继承自Animator:
常用的方法有:
用法如下:
// 空构造方法
ValueAnimator animator = new ValueAnimator();
// 创建一个实例 ,开始点0f,结束点位100f,期间经过50
ValueAnimator animator = ValueAnimator.ofFloat(0, 50 ,100);
// 创建一个实例 ,开始点0f,结束点位100
ValueAnimator animator = ValueAnimator.ofInt(0, 100);
//创建一个实例 ,开始点0,结束点位100,自定义返回的类型
ValueAnimator animator = ValueAnimator.ofObject(new TypeEvaluator() {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
// 这里的三个值分别代表了:一个0~1的float, 开始点, 结束点
return new XXX()
}
} , 0 , 100);
ObjectAnimator
继承自ValueAnimator:
设置动画的方法有:
具体用法:
ObjectAnimator.ofFloat(view , rotationX , 0.0f , 360f)
.setDuration(2000)
.start();
估值器
定义及常见的估值器如下:
使用,PositionEvaluator() 是自定义的估值器:
ValueAnimator animator = ValueAnimator.ofObject(
new PositionEvaluator(),
createPoint(RADIUS, RADIUS),
createPoint(getWidth() - RADIUS, getHeight() - RADIUS));
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (PositionPoint) animation.getAnimatedValue();
invalidate();
}
});
插值器
在属性动画一章中,我们提到最多的就是动画的时间概念,插值器就是对时间进行修改的东西,比如说你闲的蛋疼,走斑马线的时候只踩白块,这是线性的运动轨迹,而这时候突然在其中某些白块中间又插入了几个距离不相等的白块,你的步伐就不一样了,移动速度也收到了影响,这就是插值器所做的勾当。
Android 定义好的一些常用插值器:
AccelerateDecelerateInterpolator 慢 - 快- 慢
AccelerateInterpolator 慢 - 快
DecelerateInterpolator 快 - 慢
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
使用:
animation.setInterpolator(new DecelerateInterpolator());
参考致谢:
(1)、DOC
(2)、探索安卓中有意义的动画!
(3)、 Android 动画