如果您的所有图像都是 Gifs,那么只需添加 .asGif 并将您的 listener 替换为 GifDrawable,如下所示,
GlideApp.with(this)
.load(arguments?.getString(EXTRA_IMAGE_URL))
.asGif()
.onlyRetrieveFromCache(true)
.listener(object : RequestListener<GifDrawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<GifDrawable>?, isFirstResource: Boolean): Boolean {
startPostponedEnterTransition()
return false
}
override fun onResourceReady(resource: GifDrawable?, model: Any?, target: Target<GifDrawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
startPostponedEnterTransition()
return false
}
})
.into(view.ivDialog)
如果您的图片不只是 Gif,请仔细检查以下 2 个解决方案
解决方案 1-
通过设置
确保您的
Activity B是
半透明 Activity
<item name="android:windowIsTranslucent">true</item>
仅在您的Activity's Theme 中且仅当您的活动 A 是半透明的,否则请确保您的两个活动都是非半透明或半透明的。
更新:2020 年 6 月
解决方案 2-
在您的活动的onCreate() 方法调用postponeEnterTransition() 之前设置您的内容并在Glide 的onLoadFailed() 和onResourceReady() 回调中调用startPostponedEnterTransition(),
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
postponeEnterTransition()
setContentView(R.layout.activity_main)
GlideApp.with(context)
.load(myImageUrl)
.transition(DrawableTransitionOptions.withCrossFade())
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
setStartPostponedTransition(itemImage)
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
setStartPostponedTransition(itemImage)
return false
}
})
.into(itemImage)
}
注意,这个 setStartPostponedTransition() 是辅助函数,我们在 ImageView 的 onPreDraw() 回调中调用 startPostponedEnterTransition()。
private fun setStartPostponedTransition(image: ImageView) {
image.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
image.viewTreeObserver.removeOnPreDrawListener(this)
startPostponedEnterTransition()
return true
}
})
}
现在您的 Gif 将在您的 ActivityB 中播放,同时从 ActivityA 过渡,一旦您的 ImageView 的布局被绘制到屏幕上。
这个解决方案是一个疯狂的黑客!我希望它会有所帮助。
使用解决方案 2,您就可以开始了!