据我所知,有活动转换可以为活动A和活动B之间的共享元素进行转换,如下所示:
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(view1, "agreedName1"),
Pair.create(view2, "agreedName2"));
对于同一活动中的碎片,也存在片段转换。但是有没有办法在活动A的片段视图和活动B之间转换共享元素?
我的活动A有一个带有片段的ViewPager,这些片段包含我想要转换到活动B视图的视图。因此,我想要转换为活动B的视图实际上是在活动A的片段布局中,而不是直接在活动A的布局中。
有没有办法让这项工作?
答案 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);
我希望它会以某种方式帮助你。