Android共享元素过渡开始转换存在延迟。

3

我正在使用共享元素过渡和recyclerview,你可以在这个gif中看到:

进入图片描述

有一个延迟开始共享元素转换,它不是关于动画的速度,而是像一个加载延迟的开始。如果你注意到,在整个背景消失并只剩下图像的时刻,那就是我想要消除的那一刻,也就是我所说的那个延迟。我该如何消除它并使整个过程更加平滑?现在真的很丑,这是我第一次使用这个动画,如果你有建议,我会非常感激。

这是我的适配器内处理共享元素过渡的代码:

holder.image.setTransitionName("example_transition");
            Intent intent = new Intent(context, ShowElementActivity.class);
            intent.putExtra("Element", elemento);
            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                    (AnimeActivity)context, holder.image, ViewCompat.getTransitionName(holder.image));
            context.startActivity(intent, options.toBundle());

这是处理目标内部的代码:
postponeEnterTransition();
    Glide.with(this)
            .load(elemento.image_url)
            .listener(new RequestListener<Drawable>() {
                @Override
                public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                    supportStartPostponedEnterTransition();
                    return false;
                }

                @Override
                public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                    startPostponedEnterTransition();
                    return false;
                }
            })
            .into(showelement_image);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().getSharedElementEnterTransition().setDuration(200);
        getWindow().getSharedElementReturnTransition().setDuration(200)
                .setInterpolator(new DecelerateInterpolator());
    }
    Fade fade = new Fade();
    fade.excludeTarget(android.R.id.statusBarBackground, true);
    fade.excludeTarget(android.R.id.navigationBarBackground, true);
    getWindow().setEnterTransition(fade);
    getWindow().setExitTransition(fade);
1个回答

1

这种延迟是由于new Activity而不是Transition造成的,如果你不使用动画,你会看到相同的性能。因此,最好使用Fragment而不是Activity

由于新的Activity性能问题,我正在通过Single ActivityMultiple Fragments来开发应用程序,以获得最佳性能。


我从未使用过Fragments,搜索后仍不知如何使用它们来替换我的endactivity,你有什么建议吗?我只找到了一个教程,其中的用法是:在需要时调用Fragment,然后将Activity元素的可见性设置为gone。这真的是使用Fragments的方式吗? - C-Gian
1
片段的生命周期与活动有些不同。简单来说,活动是骨架,具有侧面板或操作栏中的菜单,但内容必须完全由片段管理(以获得最佳性能)。如果仅通过片段管理内容,则无需处理视图可见性。我在所有商业应用程序中都使用此设计。还有许多项目使用多个活动,但它们都存在相同的性能问题。通常开发人员使用活动而不是片段,因为它比片段更容易 :)。Android有一些糟糕的设计,这就是其中之一 :)。 - utrucceh
1
例如,我没有检查过Skyscanner的Android应用程序代码,但我可以很快感觉到他们使用Activities而不是Fragments通过转换 :) - utrucceh
哦,好的,感谢您的解释,您有一些项目示例吗?只是为了了解如何将我的应用程序从完整的活动转换为包含碎片的活动。 还有一个问题:在活动中可以完成的所有操作都可以在碎片中完成,对吧?没有任何限制吗? - C-Gian
1
你可以使用Fragment实现更多的功能(例如,方向变化在Fragment上的表现更佳)。Fragment的生命周期与Activity有些不同。通过FragmentManager来管理Fragment之间的切换,例如:activity.getSupportFragmentManager().beginTransaction().replace(R.id.yourIdd, fragment).commit() - utrucceh
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接