0 摘要
接上一篇博客Android动画之一:Tween Animation(补间动画)示例详解,我们继续学习下 Frame Animation(帧动画) 的特点及使用。
1 Frame Animation简介
Frame Animation(帧动画、逐帧动画),又叫做Drawable Animation(绘图动画),它是一系列图片按照一定顺序展示的过程,和放幻灯片相似。它和补间动画一样,实际上也属于View Animation(视图动画),可以用编码实现,也可以定义在Xml中。下面介绍下这两种方式的实现过程及效果。
2 Frame Animation实现方式
2.1 代码方式
不管哪种方式实现帧动画,都需要我们事先把图片准备好。因此,我们需要将图片放入drawable文件夹(根据名字也可以猜到放在哪了),然后就可以写代码实现帧动画了。
第一步,把冰箱门打开,错了,是获取一个AnimationDrawable实例并为其添加每一帧动画图片,将其设置为ImageView的背景,在Activity onCreate()的时候你就可以做这件事了。
/**
* 1 通过代码添加帧动画
*/
private void initAnimationDrawable1() {
// 创建AnimationDrawable实例
mAnimationDrawable = new AnimationDrawable();
// 为AnimationDrawable实例添加每一帧动画(这里投机取巧了,可能会有问题)
int startDrawableId = R.drawable.img00;
for (int i = 0; i < 25; i++) {
mAnimationDrawable.addFrame(getResources().getDrawable(startDrawableId + i), 50);
}
// 设置成循环播放
mAnimationDrawable.setOneShot(false);
mImageView.setBackground(mAnimationDrawable);
}
第二步,可以在点击播放按钮的时候去播放动画了,划重点mAnimationDrawable.start(),不好意思划错了
/**
* 播放帧动画
*/
public void playAnimation(View view) {
// 解决点击播放完成后再次点击不播放动画的问题
if (mAnimationDrawable != null) {
long animTotalDuration = (long) getFrameAnimTotalDuration(mAnimationDrawable);
long elapseTime = System.currentTimeMillis() - mAnimationLastStartTime;
if (elapseTime > animTotalDuration && mAnimationDrawable.isRunning()) {
mAnimationDrawable.stop();// 帧动画播放完成后必须调用stop() isRunning()才为false
}
} else {
return;
}
if (!mAnimationDrawable.isRunning()) {
Log.i(TAG, "playAnimation: start")