一、概述
View动画共有四种效果分别是平移动画、旋转动画、缩放动画以及透明度变化,此外帧动画也属于View动画,但实现效果与前面几种有所区别。
二、View动画的种类
四种动画分别对应四个Animation的子类TranslateAnimation、RotateAnimation、ScaleAnimation、AlphaAnimation,同时也可用XML来定义动画,分别对应标签<translate> <rotate> <scale> <alpha>,在实际应用中以XML方式为主,因为这种方式结构更为清晰。
下面简单介绍XML定义动画。在res下的anim文件夹添加动画源文件,其中最外层为set表示是一个动画集合,可以在其内部定义多种动画效果。set的常用属性有:
1、interpolator 插值器,影响动画的速度,即在播放动画时速度的变化,如最初慢逐渐加速或最初快逐渐减速等效果。
在Animations框架当中定义了一下几种Interpolator
1.AccelerateDecelerateInterpolator:在动画开始与结束的地方速率改变比较慢,在中间的时候速率快。
2.AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始加速
3.CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
4.DecelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始减速
5.LinearInterpolator:动画以均匀的速率改变
2、shareInterpolator 是否共享插值器,即动画集合内的动画是否共享set定义的插值器。
3、zAdjustment 设置的动画运行时在Z轴的位置(top/bottom/normal)
4、fillAfter 动画结束后是否保留动画效果
5、fillBefore 动画结束后是否还原初始状态
四种动画的常用属性则有
1、translate 平移动画
1、fromXDelta、toXDelta 设置X坐标的初始值以及结束值
2、fromYDelta、toYDelta 同理
2、scale 缩放动画
1、fromXScale toXScale 水平方向缩放始末值
2、fromYScale toYScale 同理
3、pivotX pivotY 缩放轴点坐标
3、rotate 旋转动画
1、fromDegrees toDegrees 旋转角度始末值
2、pivotX、pivotY 旋转的轴点坐标
轴点默认值为左上角。
4、alpha 透明度动画
1、fromAlpha toAlpha 透明度始末值
上述四种动画及set共同的常用属性还有:duration 动画持续时间 以及fillAfter和fillBefore。动画本身也可以指定自己的插值器。
使用动画非常简单,在定义XML文件后,用以下代码即可为View加载动画
Animation animation = AnimationUtils.loadAnimation(this,R.anim.animation_test); testImage.startAnimation(animation);
其中startAnimation表示立即执行动画,相对应的还有setAnimation,它表示告知View将要执行的动画,可以设定什么时候执行。
除了XML的方式外,还可以通过代码实现动画,同样很简单。
AlphaAnimation alphaAnimation = new AlphaAnimation(0,1); alphaAnimation.setDuration(3000); testImage.startAnimation(alphaAnimation);
以上为透明度动画,其他动画效果方法类似。
除了上述的使用之外还可为动画设置监听,代码如下
animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } });
三个监听方法分别对应三种状态。
三、自定义View动画
自定义View动画主要通过继承Animation抽象类,复写initialize和applyTransformation方法,其中initialize方法执行初始化工作,applyTransformation方法则进行相应的矩阵变化。在实际开发中很少用到自定义View动画。
四、帧动画
帧动画实现类似幻灯片播放的效果,播放预设的一组图片。使用的类为AnimationDrawable,对应的标签为animation-list,子标签item通过drawable指定播放的图片,duration指定图片显示时间。
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/ic_add" android:duration="1000" /> <item android:drawable="@drawable/ic_manage" android:duration="1000" /> <item android:drawable="@drawable/ic_setting" android:duration="1000" /> <item android:drawable="@drawable/ic_switch" android:duration="1000" /> </animation-list>
将上述的Drawable作为View的背景并通过Drawable的start方法播放,默认为循环播放。帧动画已造成OOM(内存溢出),应避免使用过多大尺寸图片。
TextView textView = (TextView) findViewById(R.id.frame_animation); AnimationDrawable drawable = (AnimationDrawable) textView.getBackground(); drawable.start();
五、View动画的特殊使用场景
1、LayoutAnimation
作用于ViewGroup,为ViewGroup中每个子元素的出场添加动画效果。
使用步骤主要有:
1、定义对应的XML文件,如下
<?xml version="1.0" encoding="utf-8"?> <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:delay="0.5" android:animationOrder="normal" android:animation="@anim/animation_item" />
delay为动画延迟时间,animationOrder指定动画播放顺序(normal/random/reverse),animation指定具体的动画。
2、定义具体的动画效果
3、为ViewGroup指定LayoutAnimation,通过layoutAnimation属性。
除了上述方法还可以通过代码来实现,主要通过LayoutAnimationController。
LayoutAnimationController controller = new LayoutAnimationController(animation); controller.setOrder(LayoutAnimationController.ORDER_NORMAL); listview.setLayoutAnimation(controller);
2、Activity的切换效果
主要通过overridePendingTransition(int enterAnim,int exitAnim)方法实现。
其中,enterAnim指Activity被打开时的动画资源id,exitAnim指Activity被暂停时的动画资源id。
只要在startActivity或者复写finish方法时调用该方法即可实现自定义的切换效果,注意该方法必须放在前述方法的后面。
类似的,对于碎片(Fragment)也可添加切换动画,为了兼容性,使用support-v4兼容包,通过FragmentTransaction的setCustomAnimations()来添加切换动画。