1. Drawable 动画
Drawable 动画其实就是 Frame 动画(帧动画),这种动画的实质其实是 Drawable
2. Drawable 动画第一种实现方式
这种动画的 XML 定义文件一般放在 res/drawable/
目录下,其属性具体如下:
<animation-list>
必须是根节点,包含一个或者多个<item>
元素,属性有:
android:oneshot
true 代表只执行一次,false 循环执行。<item>
类似一帧的动画资源。
<item>
animation-list 的子项,包含属性如下:
- android:drawable 一个 frame 的 Drawable 资源。
- android:duration 一个 frame 显示多长时间。
<!-- 注意:rocket.xml文件位于res/drawable/目录下 -->
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
使用:
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
特别注意,AnimationDrawable 的 start() 方法不能在 Activity 的 onCreate 方法中调运,因为 AnimationDrawable 还未完全附着到 window 上, 所以最好的调运时机是 onWindowFocusChanged() 方法中。
3.Drawable动画第二种实现方式
public class ToCodeActivity extends Activity {
private Button btn_start, btn_stop;
private ImageView iv_frame;
private AnimationDrawable frameAnim;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frameanim);
btn_start = (Button) findViewById(R.id.btn_start);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_start.setOnClickListener(click);
btn_stop.setOnClickListener(click);
iv_frame = (ImageView) findViewById(R.id.iv_frame);
frameAnim =new AnimationDrawable();
// 为AnimationDrawable添加动画帧
frameAnim.addFrame(getResources().getDrawable(R.drawable.img0), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img1), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img2), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img3), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img4), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img5), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img6), 50);
frameAnim.addFrame(getResources().getDrawable(R.drawable.img7), 50);
// 设置为循环播放
frameAnim.setOneShot(false);
// 设置ImageView的背景为AnimationDrawable
iv_frame.setBackgroundDrawable(frameAnim);
}
private View.OnClickListener click = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start:
start();
break;
case R.id.btn_stop:
stop();
break;
default:
break;
}
}
};
protected void start() {
if (frameAnim != null && !frameAnim.isRunning()) {
frameAnim.start();
Toast.makeText(ToCodeActivity.this, "开始播放", 0).show();
}
}
protected void stop() {
if (frameAnim != null && frameAnim.isRunning()) {
frameAnim.stop();
Toast.makeText(ToCodeActivity.this, "停止播放", 0).show();
}
}
}