帧动画
使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。
播放起来,有点像在看 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()
的话,会从头开始播放。
使用 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 |
帧的数量 |
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于