本文译自:http://developer.android.com/guide/topics/graphics/drawable-animation.html
绘图动画会让你依次的加载一系列的绘图资源来创建一个动画。这种动画是一种传统动画,它是用不同的图片序列来创建并依次播放的,看上去像放电影。AnimationDrawable类是绘图动画的基类。
你能够使用AnimationDrawable类的API在代码中定义动画的帧,但是,用一个单独的定义了组成动画帧的列表的XML来完成动画会更加简单。这种类型动画的XML文件要放在你的Android工程的res/drawable/目录中。这种情况下,指令是动画的播放顺序和每一帧动画的播放时间。
这个动画XML文件是由一个<animation-list>根元素和一系列的定义每一帧的<item>子元素组成。<item>元素定义了每一帧的绘图资源和播放时长。以下是绘图动画的一个示例XML文件:
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="true">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>
这个动画只有三个帧。通过把第一帧动画的android:oneshot属性设置为true,让动画播放一次,然后在最后一帧停止。如果它被设置为false,那么动画将会循环播放。使用这个保存在工程的res/drawable/目录中的rocket_thrust.xml文件,能够把一个背景图片添加到一个View对象上,然后播放动画。下面示例的Activity动画中添加了一个ImageView对象,并且在屏幕被触摸时动画开始播放:
AnimationDrawable rocketAnimation;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
rocketAnimation.start();
return true;
}
return super.onTouchEvent(event);
}
注意,在Activity的onCreate()方法执行期间,不能调用AnimationDrawable对象上的start()方法,这是至关重要的,因为AnimationDrawable对象在这时还没有跟窗口绑定。如果要立即播放动画,不需要交互,你可以在Activity的onWindowFocusChanged()回调方法中调用star()方法,onWindowFocusChanged()方法会在窗口获取焦点时被Android系统调用。
关于XML语法、可用的标签属性的更多信息,请看“动画资源”(http://developer.android.com/guide/topics/resources/animation-resource.html)