使用Glide进行简单共享元素转换的延迟

问题描述 投票:0回答:1

我在两个活动之间有一个非常简单的过渡,有时,图像停在中间,滞后,闪烁黑色。

我曾经使用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
        }
    })

这是第二个Activity的布局:

  1. constraintLayout
  2. -backbutton(ImageButton)
  3. -image(ImageView)

这是动画:

<changeBounds
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200" />

这很简单,但我无法绕过它。第二张图片最初有一些听众使用手势,我认为这就是原因,但是对所有内容进行评论仍然存在滞后现象。第一个Activity中的图像是具有相同transitionName的另一个共享元素转换的目标,这可能是问题吗?难道我做错了什么?这是ConstraintLayout的问题吗? Glide有问题吗?

在此先感谢您的帮助。

android android-glide android-transitions
1个回答
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
    }
})

UPDATE

我更新了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)在推迟时已经运行。毕加索在这种情况下有更多的光芒。

© www.soinside.com 2019 - 2024. All rights reserved.