前言
我们知道,Android的基础组件ImageView本身是不支持gif动图的,所以很长一段时间内,开发者们都是通过三方库或自定义组件来实现gif显示,而且大部分的图片加载框架都支持gif,比如Glide。
其实,从Android 9.0开始Google已经加入了gif支持————AnimatedImageDrawable,但是因为国内低版本用户存量较多,所以使用较少,今天我们就来简单看看这个AnimatedImageDrawable如何使用。
显示
我们知道,直接在ImageView中加载gif图是可以显示的,但是图不会动。但是这时候ImageView中的Drawable实际上是AnimatedImageDrawable类型的,所以我们获取这个Drawable进行操作即可,代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
imageview.setImageResource(R.mipmap.b)
var drawable = imageview.drawable
if(drawable is AnimatedImageDrawable){
drawable.start()
}
}
else{
// 堆代码 duidaima.com
...
}
可以看到AnimatedImageDrawable使用很简单,start一下gif图就可以动起来了。结果如下:

注意:AnimatedImageDrawable要求最低版本是P,所以在低版本还需要用其他方式处理。
这里还可以为AnimatedImageDrawable设置播放次数repeatCount,不设置的话就是一直重复播放。
停止/开始
AnimatedImageDrawable还提供了手动停止和开始的方法,以便我们可以控制gif的播放,如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
imageview.setImageResource(R.mipmap.b)
var drawable = imageview.drawable
if(drawable is AnimatedImageDrawable){
drawable.repeatCount = 2
drawable.start()
button.setOnClickListener {
drawable.start()
}
button2.setOnClickListener {
drawable.stop()
}
}
}
我们通过两个按钮来分别实现停止和开始,结果如下:

通过运行结果可以看到,当我们停止后再开始,gif动画会从头播放,而不是从停止的地方继续播放。而且AnimatedImageDrawable也没有提供Pause接口,所以目前是没有暂停功能的。
监听事件
AnimatedImageDrawable同样提供了监听接口registerAnimationCallback,方便我们处理gif动画开始和结束事件,代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
imageview.setImageResource(R.mipmap.b)
var drawable = imageview.drawable
if(drawable is AnimatedImageDrawable){
drawable.registerAnimationCallback(object : Animatable2.AnimationCallback(){
override fun onAnimationStart(drawable: Drawable?) {
super.onAnimationStart(drawable)
Log.e("AnimatedImageDrawable", "start")
}
override fun onAnimationEnd(drawable: Drawable?) {
super.onAnimationEnd(drawable)
Log.e("AnimatedImageDrawable", "stop")
}
})
drawable.repeatCount = 2
drawable.start()
button.setOnClickListener {
drawable.start()
}
button2.setOnClickListener {
drawable.stop()
}
}
}
这样我们就可以知道动画开始和结束的时机,做一些处理。经过测试发现,当gif动画处于播放状态,再次调用start()没有任何效果,gif动画不会从头播放,也不会执行onAnimationStart回调;同样当gif动画处理停止状态,执行stop()也没有任何效果。
总结
总体来说AnimatedImageDrawable使用起来比较简单,不过由于版本限制,同时大部分应用都通过图片加载框架来显示图片,所以目前AnimatedImageDrawable的价值还不是很高。