视图动画框架

视图动画(View Animation)框架提供了透明度、旋转、缩放和位移这几种动画,它控制的是整个View,实现原理是每次绘制View时,在其ViewGroup中的drawChild()方法调用View的draw()方法,接着在draw()方法中获取Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix())方法,通过矩阵运算实现动画帧,如果动画没有完成,就继续调用invalidate()方法,启动下次绘制来实现下一个动画帧,最终完成整个动画。

视图动画使用比较简单,提供了AlphaAnimation、RotateAnimation、ScaleAnimation、TranslateAnimation分别实现透明度、旋转、缩放和位移动画,还提供了AnimationSet实现动画集合,组合使用多种动画。不过,视图动画主要用于Android3.0之前,Android3.0之后一般使用属性动画。相比属性动画,视图动画最大的劣势是不具备交互性,当View通过视图动画产生移动后,其响应事件的位置依然还动画产生前的地方。所以,视图动画只能用来实现没有交互的动画效果,但是,它也有使用方便、效率高的优点。

具体使用视图动画时,可以通过XML文件描述动画过程,也可以使用Java代码实现同样的动画过程。

透明度动画

为视图增加透明度动画的代码如下:

1
2
3
AlphaAnimation animation = new AlphaAnimation(0, 1);
animation.setDuration(1000);
view.startAnimation(animation);

旋转动画

为视图增加旋转动画的代码如下:

1
2
3
4
RotateAnimation animation = new RotateAnimation(0, 360, 
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animation.setDuration(1000);
view.startAnimation(animation);

缩放动画

为视图增加缩放动画的代码如下:

1
2
3
4
ScaleAnimation animation = new ScaleAnimation(2, 1, 2, 1, 
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
animation.setDuration(1000);
view.startAnimation(animation);

位移动画

为视图增加位移动画的代码如下:

1
2
3
TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 200);
animation.setDuration(1000);
view.startAnimation(animation);

动画集合

通过AnimationSet可以将多个动画以组合的形式展现出来:

1
2
3
4
5
6
7
8
9
10
11
AnimationSet animationSet = new AnimationSet(true);

AlphaAnimation aa = new AlphaAnimation(0, 1);
aa.setDuration(3000);
animationSet.addAnimation(aa);

TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 200);
ta.setDuration(1000);
animationSet.addAnimation(ta);

view.startAnimation(animationSet);

动画监听

对于动画事件,Android系统提供了对应的监听回调方法, 通过监听,可以获取动画的开始、结束和重复事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
animationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {

}

@Override
public void onAnimationRepeat(Animation animation) {

}

@Override
public void onAnimationStart(Animation animation) {

}
});
坚持原创技术分享,您的支持将鼓励我继续创作!