我在两个活动之间有一个非常简单的过渡,有时,图像在中间停止,滞后,闪烁黑色。
我在Glide中多次使用共享元素转换,但这次我不能让它延迟。
这是第一个活动:
val intent = Intent(this, MediaZoomImageActivity::class.java)
intent.putExtra(MediaZoomActivity.ZOOM_MEDIA_URL, submission.imageUrl)
val bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(this,
post_image_parallax, ViewCompat.getTransitionName(post_image_parallax)).toBundle()
startActivity(intent, bundle)
这是第二个活动:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_zoom_image)
postponeEnterTransition()
back.setOnClickListener { finish() }
val url = intent.getStringExtra(ZOOM_MEDIA_URL)
Glide.with(this)
.load(url)
.apply(RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE))
.into(media_zoom_image)
media_zoom_image.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
media_zoom_image.viewTreeObserver.removeOnPreDrawListener(this)
startPostponedEnterTransition()
return true
}
})
这是第二个活动的布局:
这是动画:
<changeBounds
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200" />
这很简单,但我无法绕过它。 第二张图片最初有一些听众使用手势,我认为这就是原因,但是对所有内容进行评论仍然存在滞后现象。 第一个Activity中的图像是具有相同transitionName的另一个共享元素转换的目标,这可能是问题吗? 难道我做错了什么?这是ConstraintLayout的问题吗? Glide有问题吗?
提前感谢您的帮助。
答案 0 :(得分:2)
使用 PreDrawListener ,使用带滑动的侦听器会修复它。看起来有时间问题
Glide
.with(this)
.asBitmap()
.load(url)
.apply(RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE))
.listener(new RequestListener<Bitmap>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
media_zoom_image.setImageBitmap(resource);
startPostponedEnterTransition();
return true;
}
})
.into(media_zoom_image);
确保删除
media_zoom_image.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
media_zoom_image.viewTreeObserver.removeOnPreDrawListener(this)
startPostponedEnterTransition()
return true
}
})
<强>更新强>
我更新了onResourceReady块。请试一试。
Glide
.with(this)
.asBitmap()
.load(url)
.apply(RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE))
.listener(new RequestListener<Bitmap>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
startPostponedEnterTransition();
return false;
}
})
.into(media_zoom_image);
更新2
尽早致电 postponeEnterTransition 。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState);
postponeEnterTransition(); // Called it before set content. Try to call it before super.onCreate to see if it also works?
setContentView(R.layout.activity_zoom_image);
...
})
更新3
优化图片。有一些在线网站或工具,或者你可以问你的平面设计师。
此外,您可以增加动画的持续时间,以便为平稳加载提供时间。
<changeBounds
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300" />
请注意,滑动中的侦听器在设置位图之前运行。 Picasso和Glide之间的区别,Picasso在into()方法中的回调参数是可选的,在设置要查看的位图后运行 onSuccess()。因此,使我们的共享转换的执行不稳定(ImageView#setBitmapImage)在推迟时已经运行。毕加索在这种情况下有更多的光芒。