时间:2021-12-23 10:21:04 | 栏目:Android代码 | 点击:次
使用一系列不同的图片,然后像一卷胶卷一样按顺序播放,这是一种传统的动画,也可称为帧动画。也可以比喻为像一卷胶卷一样按顺序播放。
播放起来,有点像在看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()
方法。
var mFrameIv: ImageView? = null // override fun onCreate(savedInstanceState: Bundle?) mFrameIv = findViewById(R.id.iv1) mFrameIv!!.setBackgroundResource(R.drawable.ani_frame_1)
当动画正在播放时,调用start()
方法是不会影响当前播放的。
停止动画,AnimationDrawable.stop()
val ani: AnimationDrawable = mFrameIv!!.background as AnimationDrawable ani.stop()
stop()
方法可以让动画停止在当前帧。再调用start()
的话,会从头开始播放。
前面我们利用的是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 | 帧的数量 |