• Android中如何使用AnimatedImageDrawable组件显示gif动画
  • 发布于 2个月前
  • 369 热度
    0 评论
前言
我们知道,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的价值还不是很高。

用户评论