Android 帧动画

本贴最后更新于 990 天前,其中的信息可能已经水流花落

帧动画

使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。
播放起来,有点像在看 gif 图。

本文介绍使用 AnimationDrawable 类来实现动画效果。
为了开发方便,我们可以在 xml 中指定动画各个帧的信息。

使用背景图片

这是第一个例子。我们先准备 4 张图片(图片请自备)放进 res/drawable/ 中。
在这个目录里,再新建一个文件 ani_frame_1.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ani_frame_1"
    android:oneshot="false">
    <item
        android:drawable="@drawable/f_zan_1"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_4"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_3"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_2"
        android:duration="250" />
</animation-list>

可以看到根节点 <animation-list> 包含了 4 个 item。每个子节点都定义了一个帧。
duration 是这一帧的时常(毫秒)。drawable 是指定可绘制资源。oneshot="false",表示让动画一直循环播放下去。
这样动画资源就准备好了。

在 layout 中准备一个 ImageView,用它来显示动画

<ImageView
    android:id="@+id/iv1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="60dp" />

在 activity 中操作这个 ImageView。把动画资源设置为背景。

var mFrameIv: ImageView? = null
// override fun onCreate(savedInstanceState: Bundle?)
mFrameIv = findViewById(R.id.iv1)
mFrameIv!!.setBackgroundResource(R.drawable.ani_frame_1)

把 ImageView 的背景强转为 AnimationDrawable。播放动画,要用 AnimationDrawable.start() 方法。

val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable
ani.start()

当动画正在播放时,调用 start() 方法是不会影响当前播放的。

停止动画,AnimationDrawable.stop()

val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable
ani.stop()

stop() 方法可以让动画停止在当前帧。再调用 start() 的话,会从头开始播放。

1.gif

使用 src

前面我们利用的是 ImageView 的背景资源。我们也可以使用 src
准备另一个动画资源 ani_frame_2

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ani_frame_1"
    android:oneshot="true">
    <item
        android:drawable="@drawable/f_zan_1"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_4"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_3"
        android:duration="250" />
    <item
        android:drawable="@drawable/f_zan_2"
        android:duration="250" />
</animation-list>

android:oneshot="true",动画播放 1 次后就会自行停止并保持在最后一帧。

! 注意,停止后并不是回到第一帧。

然后在 layout 中,把它设置为 ImageView 的 src

<ImageView
    android:id="@+id/iv1"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="60dp"
    android:src="@drawable/ani_frame_2" />

在 activity 中就不是操作 ImageView 的 background 了,而是操作 drawable

// 启动
val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable
ani.start()

// 停止
val ani: AnimationDrawable = frameIv.drawable as AnimationDrawable
ani.stop()

可以看到,2 个例子中都需要操作 AnimationDrawable
请务必注意,对 AnimationDrawable.start() 方法不能在 Activity 的 onCreate() 方法期间调用,因为 AnimationDrawable 尚未完全附加到窗口。如果想立即播放动画而无需互动,那么可能需要从 Activity 中的 onStart() 方法进行调用,该方法会在 Android 在屏幕上呈现视图时调用。

AnimationDrawable 类有几个属性可以注意一下

属性 说明
isOneShot 是否只播放 1 次,与 xml 中的 android:oneshot 对应
isRunning 当前动画是否正在播放
numberOfFrames 帧的数量

参考

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 64 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...