如何使用Glide将GIF文件转为Bitmap?加载后显示静态图问题咨询
Glide加载GIF转Bitmap显示静态的问题解决办法
嗨,我来帮你捋清楚这个问题~你现在用Glide的asBitmap()方法加载GIF,这就相当于告诉Glide“我只需要这张GIF的第一帧静态图”,所以显示出来自然是静态的,这是正常现象哦。
接下来根据你的需求给你两种解决方案:
需求1:在AppWidget中显示动态GIF
因为AppWidget的RemoteViews本身不支持直接播放GIF,所以不能只靠单张Bitmap实现动态效果。推荐用Glide专门为AppWidget设计的AppWidgetTarget来处理,代码示例如下:
val appWidgetTarget = AppWidgetTarget(context, R.id.testImage, remoteViews, appWidgetId) Glide.with(context.applicationContext) .asGif() .load(R.drawable.image) .into(appWidgetTarget)
这个Target会帮你自动处理GIF的帧动画,并且更新AppWidget的RemoteViews,完美解决动态播放的问题。
需求2:获取GIF的指定帧Bitmap(比如某一帧静态图)
如果你只是想提取GIF里的某一帧Bitmap,那可以先加载成GifDrawable,再从中提取对应帧:
Glide.with(context) .asGif() .load(R.drawable.image) .into(object : CustomTarget<GifDrawable>() { override fun onResourceReady(gifDrawable: GifDrawable, transition: Transition<in GifDrawable>?) { // 这里可以获取任意帧,索引从0开始,比如获取第3帧 val targetFrameBitmap = gifDrawable.getFrame(2) remoteViews.setImageViewBitmap(R.id.testImage, targetFrameBitmap) appWidgetManager.updateAppWidget(appWidgetId, remoteViews) } override fun onLoadCleared(placeholder: Drawable?) { // 这里可以做资源清理工作,比如释放Bitmap引用 } })
简单总结下:你之前的代码用asBitmap()限制了Glide只返回第一帧,所以是静态的。根据你的实际需求选上面的方案就行啦~
内容的提问来源于stack exchange,提问作者I'boy Ak




