动画总结
补间动画
一般的动画效果,缺陷:
- 只能作用于View
- 只有固定的几种操作,无法扩展
- 只是改变了view的显示效果,view没有真正的移动。即view的在原始位置上还是存在的。
系统提供的补间动画
| xml | java code | 说明 |
|---|---|---|
| alpha | AlphaAnimation | 渐变透明度的动画 |
| scale | ScaleAnimation | 渐变尺寸的动画 |
| translate | TranslateAnimation | 转换位置的动画 |
| rotate | RotateAnimation | 旋转的动画 |
动画相关的属性
alpha

scale

translate

rotate

set集

interpolator

实例
xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:interpolator="@android:anim/accelerate_decelerate_interpolator" >
<alpha
android:fromAlpha="0"
android:toAlpha="1.0" />
<scale
android:fromXScale="0"
android:fromYScale="0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1.0"
android:toYScale="1.0" />
</set>
java:
Animation anim1 = new ScaleAnimation(0.5f, 1.0f, 0.5f, 1.0f, 0.5f, 0.5f);
anim1.setDuration(2000);
anim1.setRepeatCount(3);
anim1.setRepeatMode(Animation.REVERSE);
anim1.setInterpolator(this, interpolator.accelerate_decelerate);
anim1.setFillAfter(true);
// text.setAnimation(anim1);
Animation animTranlate = new TranslateAnimation(0, 0, 0, 400);
animTranlate.setDuration(2000);
animTranlate.setFillAfter(true);
animTranlate.setInterpolator(this, interpolator.bounce);
// text.startAnimation(animTranlate);
Animation animRotate = new RotateAnimation(0f, 360f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
animRotate.setDuration(2000);
animRotate.setInterpolator(this, interpolator.bounce);
animRotate.setFillAfter(true);
// text.startAnimation(animRotate);
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(animRotate);
animationSet.addAnimation(animTranlate);
animationSet.addAnimation(anim1);
text.startAnimation(animationSet);
补间动画自定义1:interpolator
属性动画
重要API:
Animators
- ValueAnimator:用于计算处理动画属性值 的主要属性动画时序引擎。它有所有的计算动画值的核心功能,并包含了每个动画的时序细节、动画是否重复的信息、监听接收更新事件和设置评估定制类型的能 力。有两类动画属性:1.计算动画处理的值;2.把这些值设置到要进行动画处理的对象和属性上。ValueAnimator类不执行第二类属性,因此必须 通过ValueAnimator对象来监听被计算值的变化,并且要自己修改想要的动画对象的逻辑。系统的具体实现就是ObjectAnimator类了
- ObjectAnimator:ValueAnimator 类的一个子类,它允许给目标对象和对象属性设置动画。这个类在计算新的动画值的时候,会更新属性的坐标。大多数时候都会使用ObjectAnimator 类,因为它使得动画值的处理更加容易。
- AnimatorSet:提供了一种把动画组织到一起的机制,以便它们能够彼此相互关联的运行。你能够设置动画在一起播放、顺序的播放、或者在指定的延时之后播放。
- after(Animator anim) 将现有动画插入到传入的动画之后执行
- after(long delay) 将现有动画延迟指定毫秒后执行
- before(Animator anim) 将现有动画插入到传入的动画之前执行
- with(Animator anim) 将现有动画和传入的动画同时执行
- AnimatorListener:监听器
- AnimatorListenerAdapter:监听器
Evaluators
评价器会告诉属性动画系统如何计算给定属性的值。它们利用Animator类提供时序数据:动画的开始和结束值,以及基于这些数据计算得来的属性动画值。
- IntEvaluator:默认的用于评价int类型属性计算值的评价器
- FloatEvaluator:默认的用于评价float类型属性计算值的评价器
- ArgbEvaluator:默认的用于评价颜色属性计算值的评价器
- TypeEvaluator:允许创建自定义评价器的接口。
Interpolators
控制动画的变化速率。
- AccelerateDecelerateInterpolator:变化频率在开始和结尾处慢,而在中间部分加速(系统默认)
- AccelerateInterpolator:变化频率在开始慢,然后加速
- AnticipateInterpolator:先向后,然后向前抛出(抛物运动)
- AnticipateOvershootInterpolator:先向后,向前抛出并超过目标值,然后最终返回到目标值
- BounceInterpolator:在结束时反弹
- CycleInterpolator:用指定的循环数,重复播放动画
- DecelerateInterpolator:变化频率是快出,然后减速
- LinearInterpolator:固定的变化频率
- OvershootInterpolator:向前抛出,并超过目标值,然后再返回
- TimeInterpolator:实现自定义插值的一个接口
一些代码片段
1)
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
2)
ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start();
重写评价器 TypeEvaluator
在TypeEvaluator接口中只有一个要实现的方法:evaluate()方法。这个方法允许正在使用的动画处理器返回一个适用于于当前动画时点动画属性值。
public class PointEvaluator implements TypeEvaluator{
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint = (Point) startValue;
Point endPoint = (Point) endValue;
float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
Point point = new Point(x, y);
return point;
}
}
重写补间器 TimeInterpolator
如果这个包中没有适合你需要的,你可以实现TimeInterpolator接口来创建自己的插补器。只要实现它的getInterpolation()方法即可。
public class DecelerateAccelerateInterpolator implements TimeInterpolator{
@Override
public float getInterpolation(float input) {
float result;
if (input <= 0.5) {
result = (float) (Math.sin(Math.PI * input)) / 2;
} else {
result = (float) (2 - Math.sin(Math.PI * input)) / 2;
}
return result;
}
}
结合上面的两次重写的一个完整应用
private void startAnimation() {
Point startPoint = new Point(getWidth() / 2, RADIUS);
Point endPoint = new Point(getWidth() / 2, getHeight() - RADIUS);
ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), startPoint, endPoint);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();
}
});
anim.setInterpolator(new DecelerateAccelerateInterpolator());
anim.setDuration(3000);
anim.start();
}
属性动画的xml应用
从Android3.1开始,要把使用新的属性动画的API的动画文件与那些使用传统的视图动画框架区分开,你应该把属性动画的XML文件保存在res/animator/目录中(而不是res/anim/)。animator目录名是可选的,但是如果想要使用Eclipse ADT插件(ADT11.0.0+)中的布局编辑器,就必须使用animator目录,因为ADT只搜索res/animator目录中属性动画资源。
- ValueAnimator -
<animator> - ObjectAnimator -
<objectAnimator> - AnimatorSet -
<set>
实例
<set android:ordering="sequentially">
<set>
<objectAnimator
android:propertyName="x"
android:duration="500"
android:valueTo="400"
android:valueType="intType"/>
<objectAnimator
android:propertyName="y"
android:duration="500"
android:valueTo="300"
android:valueType="intType"/>
</set>
<objectAnimator
android:propertyName="alpha"
android:duration="500"
android:valueTo="1f"/>
</set>
解析的code:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,R.anim.property_animator);
set.setTarget(myObject);
set.start();
属性动画的其他一些东西
ViewPropertyAnimator
3.1系统当中附增的一个新的功能。它是专门针对view而提供的一种比ObjectAnimator更方便的处理方式。
一张图可以说明这种方便性:

Keyframe
关键帧。
有时间和值构成的Keyframe对象会定义动画在特定的时间点上特定的状态。每个关键帧还有它自己的插补器来控制当前关键帧与前一个关键帧之间的动画行为。
要实例化一个Keyframe对象,必须使用以下工厂方法之一:ofInt()、ofFloat()、或ofObject()。使用这些工厂方法来获取对应类型的关键帧,然后调用ofKeyframe工厂方法来获取一个PropertyValuesHolder对象,一旦获得了这个对象,就能够得到一个在PropertyValuesHolder对象中传递的动画制作器对象。
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)
rotationAnim.setDuration(5000ms);
LayoutTransition
属性动画系统给ViewGroup对象的动画变化提供了与View对象一样容易动画处理方法。使用LayoutTransition类在ViewGroup内部处理布局变化的动画。
在LayoutTransition对象内通过调用setAnimator()方法,并且在传递给该方法的Animator对象参数中带有下列LayoutTransition常量之一,就能够定义该常量所代表的动画:
- APPEARING:一个标记,指示它要在容器中正在显示的项目上运行动画;
- CHANGE_APPEARING:一个标记,指示它在容器中由于新项目的出现而导致其他项目变化所要运行的动画;
- DISAPPEARING:一个标记,指示一个从容器中消失的项目所要运行的动画;
- CHANGE_DISAPPEARING:一个标记,它指示由于一个项目要从容器中消失而导致其他项目的变化,所要运行的动画。
总结
补间动画与属性动画的差异
- 补间动画提供了只让View对象具有动画效果的能力,因此想要非View对象具有动画效果,就得自己实现动画效果的代码。事实上,补间动画系统也受到了限制,它只会把很少的View对象的特征暴露给动画效果,如例如,View对象的缩放和旋转,但是没有背景色,等等。
- 补间动画的另一个缺点是,它仅能够在绘制View对象时被修改,并且不是实际的View对象本身。例如,如果要让一个按钮,以动画的形式穿越屏幕,按钮正确的绘制了,但是点击按钮的实际位置却不会改变,因此必须自己来实现这种处理逻辑。
- 在属性动画系统中,这些问题都被解决了,并且能够让任何对象的任何属性具有动画效果(View对象和非View对象),并且能够实际修改对象自身。属性动画在动画执行方面也更加健壮。在高层次上,可以给想要动画效果的属性分配动画执行器,如颜色、位置、尺寸以及能够定义的动画特性(如插值和多个动画的同步等)。
- 补间动画需要较少的创建时间,就是如果补间动画能够完成的,就不需要属性动画来做了。