Android:加速活动之间的共享元素转换

20

我有一个在两个活动之间共享元素转换的效果,它的工作方式如下:

Intent someintent = new Intent(this, someclass.class);

        if (Build.VERSION.SDK_INT >= 21) {

            ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this
                    , new Pair<>(viewClicked.findViewById(R.id.someimage), "someimage")
                    , new Pair<>(viewClicked.findViewById(R.id.someicon), "someicon")
            );
            startActivity(someintent, options.toBundle());
        }
        else {
            startActivity(someintent);
        }

这个功能可以正常工作,但转换过程非常缓慢。当第一次点击图片时,似乎会在转换发生之前停顿一两秒钟。这是由于加载的活动“重量”还是延迟可配置?


你要转换到哪个视图?当我使用需要从网络获取的图像时,我曾经遇到过延迟 - 在这种情况下,我会延迟进入转换(API的一部分),直到图像完全下载/显示。 - Booger
@Booger 我正在从一个包含图片RecyclerView的活动过渡到另一个包含相同图片的片段的活动。视图本身是一个常规的ImageView。 - Jon
请返回已翻译的文本。 - Sakiboy
2个回答

23

你尝试过更改enterTransitionreturnTransition的持续时间吗?

    private Transition enterTransition() {
        ChangeBounds bounds = new ChangeBounds();
        bounds.setDuration(2000);

        return bounds;
    }

    private Transition returnTransition() {
        ChangeBounds bounds = new ChangeBounds();
        bounds.setInterpolator(new DecelerateInterpolator());
        bounds.setDuration(2000);

        return bounds;
    }

并且在 onCreate 中:

getWindow().setSharedElementEnterTransition(enterTransition());
getWindow().setSharedElementReturnTransition(returnTransition());

1
谢谢 - 我尝试在转换的fromActivity和toActivity中都使用了它,但它并没有影响速度。因此,如果这是改变转换时间的唯一方法,那么我猜测片段的重量导致了延迟。非常感谢您的帮助。 - Jon

17

另一种可能会对已经在其样式中设置了转换的一些人有所帮助的方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().getSharedElementEnterTransition().setDuration(2000);
    getWindow().getSharedElementReturnTransition().setDuration(2000)
        .setInterpolator(new DecelerateInterpolator());
}

如果设置您的代码:window.sharedElementEnterTransition 不能为空,我会崩溃。 - famfamfam
@famfamfam 你需要确保你的转换设置正确。没有看到代码很难说。你可以添加一个空值检查或者用 Kotlin 写来避免这个错误,但这并不能解决问题。 - Codeversed

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