Android:如果其中一个共享元素位于片段中,有没有办法进行活动转换?活动A片段到活动B.

时间:2016-03-15 00:46:14

标签: android android-layout android-transitions activity-transition

据我所知,有活动转换可以为活动A和活动B之间的共享元素进行转换,如下所示:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
    Pair.create(view1, "agreedName1"),
    Pair.create(view2, "agreedName2"));

对于同一活动中的碎片,也存在片段转换。但是有没有办法在活动A的片段视图和活动B之间转换共享元素?

我的活动A有一个带有片段的ViewPager,这些片段包含我想要转换到活动B视图的视图。因此,我想要转换为活动B的视图实际上是在活动A的片段布局中,而不是直接在活动A的布局中。

有没有办法让这项工作?

2 个答案:

答案 0 :(得分:4)

是的,片段本身不会导致活动过渡出现问题。主要问题是片段往往会在以后加载其内容,并且转换系统会对可用内容感到困惑。

当转换时,视图实际上不会从一个活动移动到另一个活动。存在一个快照,其中包含位置和大小(以及位图),并将该信息传输到活动B.然后,活动B中的相应视图将从该位置和大小转换为最终位置和大小。通常不使用位图,但如果你需要它用于交叉渐变或类似的位置。

如果共享元素位于活动A中的片段中,则传出转换很好 - 视图存在并且位置正确。唯一的潜在问题是回归过渡。当活动B关闭时,可能需要重新启动活动A(内存压力,方向更改等)。在这种情况下,必须重新创建片段并正确放置视图。在onActivityReenter中,调用postponeEnterTransition,然后在加载片段并完成布局后,调用startPostponedEnterTransition。然后,活动B将知道共享元素的最终位置和大小,因此它可以开始动画。

当活动B在片段中具有共享元素时,反过来也是如此。您必须在onCreate中推迟输入转换,直到加载片段并在活动B中完成布局为止。

答案 1 :(得分:0)

我不知道这对你有帮助,但我做了类似的事。

ActivityOptionsCompat options = ActivityOptionsCompat
                        .makeSceneTransitionAnimation(getActivity(),
                                (View) viewHolder.clickme, "zoom");
                getActivity().startActivity(i, options.toBundle());
                getActivity().overridePendingTransition(R.anim.fadein,
                        R.anim.fadeout);

我希望它会以某种方式帮助你。