一.Android 动画总结
1.动画分类 View Animation,Drawable Animation,Property Animation。
1.1 View Animation (用于视图对象)
translate位移动画 , rotate 旋转动画, alpha透明度动画, scale缩放动画,AnimationSet 组合动画。
启动动画view.startAnimation() 停止动画
1.2 Drawable Animation (用于)
AnimationDrawable anim = new AnimationDrawable();
for (int i = 1; i <= 3; i++) {
int id = getResources().getIdentifier(“girl” + i, “drawable”, getPackageName());
Drawable drawable = getResources().getDrawable(id);
anim.addFrame(drawable, 100);
}
View.setBackgroundResource(R.anim.frame);
AnimationDrawable anim = (AnimationDrawable) image.getBackground();
anim.start();
注:想activity一开始就播放请放在onWindowFocusChanged方法里
1.3 Property Animation
1.3.1使用ValueAnimator创建动画
要获取ValueAnimator实例,可以通过调用它的工厂方法: ofInt(), ofFloat(), or ofObject()。例如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
上面的例子实现了在1000ms内,值从0-1的变化。也可以提供一个自定义的Evaluator:
ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();
上面的代码片段中,ValueAnimator仅仅是计算动画过程中变化的值,并没有把这些计算出来的值应用到具体的对象上面,所以也不会有什么的动画显示出来。要把计算出来的值应用到对象上,必须为ValueAnimator注册一个监听器ValueAnimator.AnimatorUpdateListener,该监听器负责更新对象的属性值。在实现这个监听器的时候,可以通过getAnimatedValue()的方法来获取当前帧的值。
1.3.2 使用ObjectAnimator创建动画
ObjectAnimator与ValueAnimator的区别是,ObjectAnimator是继承自ValueAnimator,ObjectAnimator可以直接地把动画过程中计算出来的的值应用到一个具体对象的属性上,而ValueAnimator需要另外注册一个监听器来完成这个工作。所以使用ObjectAnimator就不再需要实现ValueAnimator.AnimatorUpdateListener了。
实例化ObjectAnimator相似于ValueAnimator,但你还需要指定具体的对象和对象的属性名(字符串形式)
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, “alpha”, 0f, 1f);
anim.setDuration(1000);
anim.start();
为了让ObjectAnimator能正常地运作,你还需要注意下面几点:
要为对应的对象提供setter方法,如上例中需要为foo对象添加setAlpha(float value)方法。在不能修改对象源码的情况下,要不先对对象进行封装(extends),或者使用ValueAnimator。
如果ObjectAnimator的工厂方法中的values… 参数提供了一个值(原本需要提供起始值和结束值),那么该值会被认为是结束值。起始值需要通过对象的getter方法提供,因此,在这种情况下,还需要提供对应属性的getter方法。
ObjectAnimator.ofFloat(targetObject, “propName”, 1f)
如果动画的对象是View,那么就可能需要在 onAnimationUpdate() 回调函数中调用View.invalidate()方法来刷新屏幕的显示。比如说,设置Drawable对象的color属性。但是,View中的所有setter方法,如 setAlpha() and setTranslationX()会自动地调用invalidate()方法,因此不需要额外地调用invalidate()方法。