详解Android动画之Frame Animation 一点小细节

逐帧动画可以放置在/res下的anim或drawable目录中。如果由完全由编码实现,我们需要使用到AnimationDrawable对象。

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

public class FrameActivity extends Activity {
 
 private ImageView image;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.frame);
  image = (ImageView) findViewById(R.id.frame_image);
  
  image.setBackgroundResource(R.anim.frame);
  AnimationDrawable anim = (AnimationDrawable) image.getBackground();
  anim.start();
 }
}

看似十分完美,跟官方文档上写的一样,然而当我们运行这个程序时会发现,它只停留在第一帧,并没有出现我们期望的动画,什么原因呢?如何解决呢?

出现这种现象是因为当我们在onCreate中调用AnimationDrawable的start方法时,窗口Window对象还没有完全初始化,AnimationDrawable不能完全追加到窗口Window对象中,那么该怎么办呢?我们需要把这段代码放在onWindowFocusChanged方法中,当Activity展示给用户时,onWindowFocusChanged方法就会被调用,我们正是在这个时候实现我们的动画效果。当然,onWindowFocusChanged是在onCreate之后被调用的

package com.itheima;

import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.ImageView;

@SuppressWarnings("unused")
public class FrameAnimation1Activity extends Activity {
	private ImageView iv ;
    private AnimationDrawable drawable;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        iv = (ImageView) this.findViewById(R.id.frame_image);
//        iv.setBackgroundResource(R.drawable.list);
//        drawable = (AnimationDrawable) iv.getBackground();
    }
    
    @Override
	public void onWindowFocusChanged(boolean hasFocus) {
		super.onWindowFocusChanged(hasFocus);
		iv.setBackgroundResource(R.drawable.list);
		AnimationDrawable anim = (AnimationDrawable) iv.getBackground();
		anim.start();
	}
//	@Override
//	public boolean onTouchEvent(MotionEvent event) {
//		if(event.getAction()==MotionEvent.ACTION_DOWN){
//			//开始播放帧动画
//			drawable.start();
//		
//		}
//		return super.onTouchEvent(event);
//	}
}

运行一下,动画就可以正常显示了。

代码下载:http://download.csdn.net/detail/mwq384807683/5963973

你可能感兴趣的:(详解Android动画之Frame Animation 一点小细节)