一些不同的图片连续起来快速播放给人眼一种动画的错觉,这就是我所理解的逐帧动画。
首先看一下运行效果:
AnimationDrawable 类的继承关系:
下面看一下具体的实现方式:
在res下的drawable目录下创建 bird_fly_animation.xml
用来放置逐帧动画的图片素材
根节点是animation-list(动画列表),里面有一个或者多个item节点组成,oneshot属性表示是否只播放一次,true表示只会播放一次,false表示一直循环播放,内部用item节点声明一个动画帧,android:drawable指定此帧动画所对应的图片资源,android:druation代表此帧持续的时间,整数,单位为毫秒。
2. 创建一个ImageView作为容器显示:
3.代码中的实现:
/**
* 安卓逐帧动画的使用
*/
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private AnimationDrawable animationDrawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.animation_iv);
imageView.setImageResource(R.drawable.bird_fly_animation);
//AnimationDrawable播放动画是依附在window上面的,而在Activity onCreate方法中调用时Window还未初始化完毕,所有才会停留在第一帧
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
imageView.setImageAlpha(R.drawable.bird_fly_animation);
animationDrawable = (AnimationDrawable)imageView.getDrawable();
// true 只播放一次
// false 循环播放
animationDrawable.setOneShot(false);
animationDrawable.start();
}
public void clickStart(View v){
if(animationDrawable!=null && !animationDrawable.isRunning()){
animationDrawable.start();
}
}
public void clickStop(View v){
if(animationDrawable!=null && animationDrawable.isRunning()){
animationDrawable.stop();
}
}
}
需要注意的是:直接将 bird_fly_animation.xml 设置给 ImageView 运行时是没有动画效果的,此时显示的为第一帧的图片,因为AnimationDrawable播放动画是依附在window上面的,而在Activity onCreate方法中调用时Window还未初始化完毕,所有才会停留在第一帧,因此要在onWindowFocusChanged方法中进行上面代码中的设置。
AnimationDrawable类常用的方法: