布局动画
android:animateLayoutChanges="true"
在4.1 JellyBean上还有一个增强的功能,可以在容器内的子view的layout发生变化时也播放动画,用法如下。
LayoutTransition transition = container.getLayoutTransition();
transition.enableTransitionType(LayoutTransition.CHANGING);
Animation set
先后次序地执行动画
ObjectAnimator topFlipAnimator = ObjectAnimator.ofFloat(view, "topFlip", - 30);
topFlipAnimator.setStartDelay(200);
topFlipAnimator.setDuration(1000);
ObjectAnimator flipRotationAnimator = ObjectAnimator.ofFloat(view, "flipRotation", 270);
flipRotationAnimator.setStartDelay(200);
flipRotationAnimator.setDuration(1000);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playSequentially(bottomFlipAnimator, flipRotationAnimator, topFlipAnimator);
animatorSet.setStartDelay(1000);
animatorSet.start();
PropertyValuesHolder
在同一个动画中,需要共享动画的开始时间、结束时间、Interpolator 等等一系列的设定
PropertyValuesHolder topFlipHolder = PropertyValuesHolder.ofFloat("topFlip", -30);
PropertyValuesHolder flipRotationHolder = PropertyValuesHolder.ofFloat("flipRotation", 270);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, bottomFlipHolder, topFlipHolder, flipRotationHolder);
animator.setStartDelay(1000);
animator.setDuration(1000);
animator.start();*/
Keyframe
使用 PropertyValuesHolder.ofKeyframe() 来把一个属性拆分成多段,执行更加精细的属性动画
Keyframe keyframe1 = Keyframe.ofFloat(0, 0);
Keyframe keyframe2 = Keyframe.ofFloat(0.1f, 1.5f * distance);
Keyframe keyframe3 = Keyframe.ofFloat(0.9f, 0.6f * distance);
Keyframe keyframe4 = Keyframe.ofFloat(1, distance);
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("translationX", keyframe1, keyframe2, keyframe3, keyframe4);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view, holder);
animator.setStartDelay(1000);
animator.setDuration(2000);
animator.start();
TypeEvaluator
class PointFEvaluator implements TypeEvaluator<PointF> {
@Override
public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
float x = startValue.x + (endValue.x - startValue.x) * fraction;
float y = startValue.y + (endValue.y - startValue.y) * fraction;
return new PointF(x, y);
}
}
除了 ViewPropertyAnimator 和 ObjectAnimator,还有第三个选择是 ValueAnimator。ValueAnimator 并不常用,因为它的功能太基础了。ValueAnimator 是 ObjectAnimator 的父类,实际上,ValueAnimator 就是一个不能指定目标对象版本的 ObjectAnimator。ObjectAnimator 是自动调用目标对象的 setter 方法来更新目标属性的值,以及很多的时候还会以此来改变目标对象的 UI,而 ValueAnimator 只是通过渐变的方式来改变一个独立的数据,这个数据不是属于某个对象的,至于在数据更新后要做什么事,全都由你来定,你可以依然是去调用某个对象的 setter 方法(别这么为难自己),也可以做其他的事,不管要做什么,都是要你自己来写的,ValueAnimator 不会帮你做。功能最少、最不方便,但有时也是束缚最少、最灵活。比如有的时候,你要给一个第三方控件做动画,你需要更新的那个属性没有 setter 方法,只能直接修改,这样的话 ObjectAnimator 就不灵了啊。怎么办?这个时候你就可以用 ValueAnimator,在它的 onUpdate() 里面更新这个属性的值,并且手动调用 invalidate()。