逐帧动画:Frame Animation
逐帧动画,简单好用的动效,一帧一帧的播放图片。比如一般手机刚开机时候显示的Logo是逐帧动画,注意逐帧动画需要加载大量的图片,因而很耗内存,使用的时候一定要注意别导致内存泄漏和OOM,不要加载过多和过大的图片。有两种方式实现逐帧动画:代码方式和XML方式。
1、代码实现
逐帧动画用到的AnimationDrawable类,通过该类可以用代码实现逐帧动画的效果。
1.1、AnimationDrawable类
逐帧动画用到的AnimationDrawable类在android.graphics.drawable包中,AnimationDrawable用于创建由一系列Drawable对象定义的逐帧动画,这些对象可用作View对象的背景。
1.2、代码实现
①构造AnimationDrawable对象
AnimationDrawable animationDrawable = new AnimationDrawable();②添加res/drawable/资源,一般资源文件都是带序列的,所以通过文件名getIdentifier()查找到资源id再添加。
for (int i = 1; i <= 15; i++) {
int drawableID = getResources().getIdentifier("movie_" + i, "drawable", getPackageName());
Drawable drawable = getResources().getDrawable(drawableID, getTheme());
animationDrawable.addFrame(drawable, 100);
}③设置给ImageView作为背景
imageView.setImageDrawable(animationDrawable);④设置逐帧动画并开始播放
animationDrawable.setOneShot(false);
animationDrawable.start();2、xml实现
创建逐帧动画的最简单方法是在XML文件中定义动画,该动画文件位于res/drawable/文件夹中,并将其设置为View对象的背景。然后,调用start()运行动画。
2.1、创建XML
逐帧动画的xml必须定义在res/drawable/文件夹下,否则无法识别animation-list标签。查看老的博客似乎以前也可以定义在res/anim/动画目录下,现在不可用。XML属性含义说明:
①android:drawable:引用要用于框架的可绘制资源
②android:duration:显示此帧的时间(以毫秒为单位)
③android:oneshot:如果为true,则动画将只运行一次,然后停止。如果为false(默认值),它将继续运行,在最后一帧结束后从第一帧重新开始。
④android:variablePadding:如果为true,则允许可绘制对象的填充基于所选的当前状态进行更改。如果为false,则填充将保持不变(基于所有状态的最大填充)。启用此功能要求可绘制对象的所有者在状态更改时处理布局,而这通常不受支持。
⑤android:visible:提供可绘制对象的初始可见性状态;默认值为false。
例子:
<?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/movie_1"
android:duration="120" />
<item
android:drawable="@drawable/movie_2"
android:duration="120" />
<item
android:drawable="@drawable/movie_3"
android:duration="120" />
<item
android:drawable="@drawable/movie_4"
android:duration="120" />
<item
android:drawable="@drawable/movie_5"
android:duration="120" />
<item
android:drawable="@drawable/movie_6"
android:duration="120" />
<item
android:drawable="@drawable/movie_7"
android:duration="120" />
<item
android:drawable="@drawable/movie_8"
android:duration="120" />
<item
android:drawable="@drawable/movie_9"
android:duration="120" />
<item
android:drawable="@drawable/movie_10"
android:duration="120" />
<item
android:drawable="@drawable/movie_11"
android:duration="120" />
<item
android:drawable="@drawable/movie_12"
android:duration="120" />
<item
android:drawable="@drawable/movie_13"
android:duration="120" />
<item
android:drawable="@drawable/movie_14"
android:duration="120" />
<item
android:drawable="@drawable/movie_15"
android:duration="120" />
</animation-list>添加连续的一系列图片资源,这样播放起来效果连续。其实动画片也是这样一系列图片播放形成的。

2.2、添加背景
直接将逐帧动画XML设置为View的背景android:background
<ImageView
android:id="@+id/animation_drawable"
android:background="@drawable/drawable_animation" />2.3、获取AnimationDrawable播放
前面通过android:background设置逐帧动画xml背景,所以还是通过调用View的getBackground()方法获取AnimationDrawable对象,需要类型转换。
ImageView imageView = findViewById(R.id.animation_drawable);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();
相关资料:
Docs > Reference > AnimationDrawable">Android Developers > Docs > Reference > AnimationDrawable
Android 动画之逐帧动画(Frame Animation)

