Android动画中其实功能强大的要数property animation(属性动画),毕竟View动画只提供给了一些简单的动画实现方式,不信?我们现在假设需要做一个按钮背景变换的动画,你觉得View动画能实现吗?是不是感觉一脸懵比。。。
来来,我们先说说View动画和属性动画各自的原理:
View动画:通过改变View的对象,来实现动画效果。
属性动画:通过改变View对象的属性,来实现动画效果。
so. 上面提到的效果我们还是得用属性动画实现,这时候你晓得属性动画的重要性了吧。
坐稳了,骚年们,小司机要发车了!
ValueAnimator
属性动画的核心类,虽然我们常用的不是它(而是ObjectAnimator),但它ObjectAnimator的基类,我们上面已经说了属性动画是通过改变View的属性值来实现动画的,如下图:ofxxx( )方法里可以传入多个参数,在实际编码中,我们只需要告诉它(ValueAnimator)初始值、结束值、执行时间,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果,它的内部使用一种时间循环的机制来计算值与值之间的动画过渡。
ps:
ValueAnimator animator = ValueAnimator.ofInt(0, 100);
animator.setDuration(3000);
// animator.setStartDelay(1000); 动画延迟播放
// animator.setTarget(null); 设置动画到具体对象
// animator.setRepeatCount(3); 播放次数
// animator.setRepeatMode(ValueAnimator.REVERSE); 模仿模式
// animator.setEvaluator(new ArgbEvaluator()); 估值器(背景变化变化)
// animator.setInterpolator(new LinearInterpolator()); 差值器(比如加速、匀速等)
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.i(TAG, "onAnimationUpdate: "+animation.getAnimatedValue());
}
});
当然还有好多,大家可以去看api用法,
ObjectAnimator
ObjectAnimator是我们比较常用的类,刚才我们已经说了ObjectAnimator继承自ValueAnimator ,ValueAnimator是对值进行了一个平滑的动画过渡,而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,我们先来看下ObjectAnimator的方法:
我们传入要操作的对象、要改变的属性值,变化值。。。就可以实现了,
ObjectAnimator ani = ObjectAnimator.ofFloat(view, "alpha", 1.0, 0f);
ani.setDuration(3000);
ani.start();
比如以上代码我们对它的透明度做动画,你是不是很好奇alpha这个属性值,属性动画是通过改变属性值来实现动画的,但是我们的view中并没有
alpha属性值,而是通过setAlpha()方法来改变的,我们看下源码:
AnimatorSet
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法(当然还有其他方法如下图),
其中第二、五个是一起播放动画, 第三、四个是有序播放,play()会返回一个AnimatorSet.Builder对象,该对象该有一下方法:
after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行
Interpolator(插值器)
就是用来控制动画的速度,比如有加速度、匀速的。
我们看下插值器的继承结构:
红色标记的就是常用的,Gityuan写过详细的解释,大家可以看下。
Evaluators( 估值器)
用于计算属性动画的给定属性的取值,与属性的起始值,结束值,fraction三个值相关.
我们看下估值器继承结构:
有的哥们肯定说,没有例子你说个卵
前辈们的例子早就写好了: