当前位置: 首页 > 知识库问答 >
问题:

使用Glide的简单共享元素转换滞后

厉熠彤
2023-03-14

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

我已经在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
        }
    })

这是第二个活动的布局:

  1. 约束布局

这是动画:

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

这很简单,但我无法理解它。第二个图像最初有一些侦听器使用手势,我认为这就是原因,但注释所有内容仍然会滞后。第一个活动中的图像是另一个具有相同转换名称的共享元素转换的目标,这可能是问题所在吗?我做错了什么吗?是ConstraintLayout的问题吗?Glide有问题吗?

提前感谢您的帮助。

共有1个答案

东郭自强
2023-03-14

相反,使用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

尽早呼叫延迟过渡。

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" />

请注意,glide中的侦听器在将bitmap设置为view之前运行。毕加索和Glide的不同之处在于,毕加索在into()方法中有一个可选的回调参数,该参数在将位图设置为view后运行onSuccess()。因此,使我们共享转换的执行是断断续续的(ImageView#setBitmapImage),已经在延迟时运行了。在这种情况下,毕加索更为耀眼。

 类似资料:
  • 我希望采用Glide库来代替通用图像加载器,但在共享元素转换方面遇到了问题。 在我的简单沙盒中,我使用UIL创建了以下过渡:https://dl.dropboxusercontent.com/u/97787025/device-2015-06-18-113333.mp4 非常简单,而且效果很好。但当我使用Glide时,它看起来不太好看:https://dl.dropboxusercontent.c

  • 我一直在尝试实现这个共享元素转换,并在单击转换时不断出现“java.lang.IllegalArgumentException:共享元素不能为null”错误。请帮忙。 这是下面给出的MainActive onCreate方法。请检查我的代码。 这是recyclerView的onClickListener。 图像的过渡名称相同。这里的bug修复在使用共享元素的活动转换中出现问题并不是问题所在。 我卡

  • 我正在尝试使用Glide图像加载库进行共享元素转换。我有一个具有数百个图像的RecyclerView,因此我想保存内存(如果可能的话),并使动画工作。 Glide创建了一个具有目标图像大小的绘图对象,因此共享元素转换不能很好地工作,因为最终图像具有不同的大小(但图像具有相同的url)。 如何使用Glide实现共享元素转换?是否可以同时保存内存和动画?

  • 我正在实现一个gallery应用程序,它有一个片段,其中包含一个带有图像的RecyclerView,单击一个图像,我会转到ViewPager循环浏览图像 目前,我正试图实现像本视频中那样的入门动画。问题是动画不起作用,我显然遗漏了一些东西(只是显示与转换相关的代码): 查看页面: GridAdapter: 在MainActivity中,我在onClick中实例化ViewPagerFragment:

  • 我在Lollipop上的共享元素转换中看到了奇怪的事情。共享元素在开始动画之前闪烁(请看视频https://www.youtube.com/watch?v=DCoyyC_S-9A) 我不知道为什么会这样。但是,当我添加

  • 当完成活动时,我正在更新包含viewpager的活动中的视图及其名称,但它会闪烁: