有两种方式
1、通过在xml定义一个animation-list:
<?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/img01" android:duration="50" />
<item android:drawable="@drawable/img02" android:duration="50" />
<item android:drawable="@drawable/img03" android:duration="50" />
<item android:drawable="@drawable/img04" android:duration="50" />
</animation-list>
然后在Java中的代码处理如下:
// Load the ImageView that will host the animation and
// set its background to our AnimationDrawable XML resource.
ImageView img = (ImageView)findViewById(R.id.spinning_wheel_image);
img.setBackgroundResource(R.drawable.spin_animation);
// Get the background, which has been compiled to an AnimationDrawable object.
AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
// Start the animation (looped playback by default).
frameAnimation.start();
2、直接在代码中动态添加frame:
animationDrawable = new AnimationDrawable();
for(int i=1; i<5; i++) {
int id = getResources().getIdentifier("img0" + i, "drawable", getPackageName());
Log.d("DEBUG", "ID: " + id);
Drawable drawable = getResources().getDrawable(id);
animationDrawable.addFrame(drawable, 100);
}
imageView.setBackgroundDrawable(animationDrawable);
animationDrawable.setOneShot(false);
在这里有一点需要注意的是AnimationDrawable的start()不能在直接在onClick,onStart,onResume里面启动,是无效的,无法启动动画,只能写在比如事件监听当中。下面有几种启动方法(这里参考http://www611.iteye.com/blog/1217096):
第一种方式启动帧动画:(在Activity启动时会自动运行动画)
AnimationDrawable ad;
ImageView iv = (ImageView) findViewById(R.id.animation_view);
iv.setBackgroundResource(R.drawable.animation);
ad = (AnimationDrawable) iv.getBackground();
iv.getViewTreeObserver().addOnPreDrawListener(opdl);
//当一个视图树将要绘制时产生事件,可以添加一个其事件处理函数
OnPreDrawListener opdl=new OnPreDrawListener(){
@Override
public boolean onPreDraw() {
ad.start();
return true; //注意此行返回的值
}
};
第二种方式启动动画:(在Activity启动时会自动运行动画)
ImageView image = (ImageView) findViewById(R.id.animation_view);
image.setBackgroundResource(R.anim.oldsheep_wait);
animationDrawable = (AnimationDrawable) image.getBackground();
RunAnim runAnim=new RunAnim();
runAnim.execute("");
class RunAnim extends AsyncTask<String, String, String>
{
@Override
protected String doInBackground(String... params) {
if (!animationDrawable.isRunning()) {
animationDrawable.stop();
animationDrawable.start();
}
return "";
}
}
第三种方式启动动画:(在Activity启动时会自动运行动画)
ImageView image = (ImageView) findViewById(R.id.animation_view);
image.setBackgroundResource(R.anim.oldsheep_wait);
animationDrawable = (AnimationDrawable) image.getBackground();
image.post(new Runnable() {
@Override
public void run() {
animationDrawable.start();
}
});
第四种方式启动动画:(在Activity启动时会自动运行动画)
ImageView image = (ImageView) findViewById(R.id.animation_view);
image.setBackgroundResource(R.anim.oldsheep_wait);
animationDrawable = (AnimationDrawable) image.getBackground();
@Override
public void onWindowFocusChanged(boolean hasFocus) {
animationDrawable.start();
super.onWindowFocusChanged(hasFocus);
}
完整代码如下:
package com.lau.frame;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.widget.ImageView;
public class AnimationFrameDemoActivity extends Activity {
private ImageView imageView;
private AnimationDrawable animationDrawable;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.imageView1);
imageView.setBackgroundResource(R.drawable.frame_list);
animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();
// animationDrawable = new AnimationDrawable();
// for(int i=1; i<5; i++) {
// int id = getResources().getIdentifier("img0" + i, "drawable", getPackageName());
// Log.d("DEBUG", "ID: " + id);
// Drawable drawable = getResources().getDrawable(id);
// animationDrawable.addFrame(drawable, 100);
// }
// imageView.setBackgroundDrawable(animationDrawable);
// animationDrawable.setOneShot(false);
// imageView.post(new Runnable() {
// @Override
// public void run() {
// animationDrawable.start();
// }
// });
}
}