2.9 Android动画效果

适当地使用动画效果可以很好地提升Android应用或游戏的操作体验。目前Android系统支持的动画效果主要有两种,即逐帧动画(Frame Animation)和补间动画(Tween Animation)。虽然,在Android 3.0以后的版本中还引入了新的动画系统,但是目前最主流的动画效果还是这两种。

2.9.1 逐帧动画(Frame Animation)

逐帧动画类似于GIF动画图片,即按照顺序播放图片。我们通常会在Android项目的res/drawable/目录下面定义逐帧动画的XML模板文件。编码的时候,需要在动画模板文件的<animation-list/>标签中依次放入需要播放的图片,并设置好播放的间隔时间,如代码清单2-34所示。

代码清单 2-34

<animation-list
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="false">
  <item android:drawable="@drawable/a001" android:duration="100"/>
  <item android:drawable="@drawable/a002" android:duration="100"/>
  <item android:drawable="@drawable/a003" android:duration="100"/>
  ...
</animation-list>

然后,就可以在Activity界面控制器的逻辑中自由使用了。需要注意的是,逐帧动画并不能独立使用,动画效果的显示还是要借助于ImageView图像控件,简单地说,也就是把动画效果绑定到对应的ImageView图片对象上。假设这里的ImageView元素的ID值,即android:id属性值为img_frame_anim,而之前定义的动画模板文件名为demo_frame_anim.xml,逐帧动画的使用范例如代码清单2-35所示。

代码清单 2-35

public class DemoAnimationActivity extends Activity {

  ImageView iv;
  AnimationDrawable ad;

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 获取对应图片的ImageView对象
        iv = (ImageView) findViewById(R.id.img_frame_anim);
        // 设置对应图片的背景为动画模板文件
        iv.setBackgroundResource(R.drawable.demo_frame_anim);
        // 初始化动画对象
        ad = (AnimationDrawable) imageView.getBackground();
        // 开始动画
        ad.start();
  }

  public void onPause() {
        super.onPause();
        // 停止动画
        ad.stop();
  } 

  ... 
}

以上代码的逻辑非常简单,我们可以重点关注AnimationDrawable对象的用法,即如何使用start和stop方法控制逐帧动画的播放和停止。

2.9.2 补间动画(Tween Animation)

补间动画与逐帧动画在本质上是不同的,逐帧动画通过连续播放图片来模拟动画的效果,而补间动画则是通过在两个关键帧之间补充渐变的动画效果来实现的。目前Android应用框架支持的补间动画效果有以下5种。具体实现在android.view.animation类库中。

·AlphaAnimation:透明度(alpha)渐变效果,对应<alpha/>标签。

·TranslateAnimation:位移渐变,需要指定移动点的开始和结束坐标,对应<translate/>标签。

·ScaleAnimation:缩放渐变,可以指定缩放的参考点,对应<scale/>标签。

·RotateAnimation:旋转渐变,可以指定旋转的参考点,对应<rotate/>标签。

·AnimationSet:组合渐变,支持组合多种渐变效果,对应<set/>标签。

补间动画的效果同样可以使用XML语言来定义,这些动画模板文件通常会被放在Android项目的res/anim/目录下。比如,代码清单2-36中就定义了一个组合式的渐变动画效果。

代码清单 2-36

<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/decelerate_interpolator">   
  <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        android:duration="1000" />
  <scale
        android:fromXScale="0.1"
        android:toXScale="1.0"
        android:fromYScale="0.1"
        android:toYScale="1.0"
        android:duration="1000"
        android:pivotX="50%"
        android:pivotY="50%"
        android:startOffset="100" />
</set>

以上补间动画有两个效果:首先,在1秒(1000ms)的时间内,透明度从0(完全透明)变成1(不透明);同时,大小从原先的1/10变成正常大小,缩放的中心点是元素的中心位置。假设以上动画效果的模板文件名为demo_tween_anim.xml,现在我们要把该动画效果应用到一张ID为img_tween_anim的图片上,实现方法见代码清单2-37。

代码清单 2-37

...
ImageView iv = (ImageView) findViewById(R.id.img_tween_anim);
Animation anim = AnimationUtils.loadAnimation(this, R.anim.demo_tween_anim);
iv.startAnimation(anim);
...

在实际项目中,我们经常使用补间动画,原因是补间动画使用起来比较方便,功能也比逐帧动画强大不少,而且还可以很方便地进行动画叠加,实现更加复杂的效果。实际上,代码清单2-36中的<set/>标签对应的就是AnimationSet类,即“动画集合”的概念,支持加入多种动画效果,如渐变动画(alpha)、大小动画(scale),线性动画(translate)等。另外,在Android系统中,所有与动画相关的类都归类在android.view.animation包之下,大家可以参考SDK文档进行进一步学习。

至此,我们已经初步了解了如何在Android系统中使用各种动画效果,包括逐帧动画和补间动画。显而易见的是,在Android平台之上,开发者们可以很方便地使用各种动画效果来为应用产品增色。此外,使用动画效果还可以帮助我们制作出简单的Android游戏,更多与Android游戏开发有关的内容请参考本书第13章。