Android Frame动画——AnimationDrawable

有两种方式

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();
//			}
//		});
    }
    
}


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值