在Android Lollipop中,不同活动之间的片段之间共享元素过渡

10
我在一个属于某个Activity的Fragment中有一个共享元素。我想使用另一个Activity中的Fragment中的元素来进行Android Lollipop平台上的共享元素过渡效果。
这是否可能?如何实现?
2个回答

10

这是可能的。

首先,在您的片段中检测到即将发生转换时,建立一个数组Pair<View, String>,其中包含视图和转换名称。

例如,如果您想要从缩略图像动画到全宽图像:

  Pair[] pairs = new Pair[1];
  pairs[0] = new Pair(thumbnailImage, "THUMBNAIL_IMAGE");

其次,将该数组传递给Fragment的Activity,以便它可以启动实际的转换。(我使用Otto将该事件传递上去,您可以使用常规回调函数)。

然后,在您的Activity中,启动第二个Activity。(我创建了一个简单的方法来完成这个操作)

public static void transitionExpand(Activity activity, Intent intent, Pair<View, String>[] sharedElements) {
        ActivityOptionsCompat options =
            ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements);

        ActivityCompat.startActivity(activity, intent, options.toBundle());
}

在您的第二个活动中,您可以以通常的方式添加片段。然后,在第二个片段的 onViewCreated() 方法中,您可以调用:

在您的第二个活动中,您可以像往常一样添加片段。然后,在第二个片段的 onViewCreated() 方法中,您可以调用:

ViewCompat.setTransitionName(fullWidthImage, "THUMBNAIL_IMAGE");

希望它能有所帮助


1
哦,你的片段嵌入在ViewPager中?我也遇到了这个问题,但我无法使其工作。 - Tomislav Novoselec
3
在第二个片段布局中将android:transitionName="THUMBNAIL_IMAGE"设置为共享视图也可以起作用。我发现这种解决方案仅适用于在父XML中静态声明的片段,而不适用于动态添加的片段。 - user1405990
从B活动的FragmentB返回到A活动的Fragment A时出现问题,@Katharina,你能确认一下吗? - extmkv
1
据我所记,动画可以双向工作。 - Katharina
1
我发现问题了 @Katharina! 事务应该在 activity::onStart 之前完成。 - extmkv
显示剩余3条评论

2
更新:从支持库v25.1.1开始,这些方法也在支持片段中。文档链接:Fragment.postponeEnterTransition()Fragment.startPostponedEnterTransition() 原回答:
即使是在第二个活动中动态添加片段,也是可能的。
您只需要告诉第二个活动在共享元素布局和测量完成之前不要运行其转换动画。
在第二个活动的onCreate中调用postponeEnterTransition()(如果您使用支持库,则调用supportPostponeEnterTransition())。将片段动态添加到此活动中。在您动态添加的片段的onCreateView方法末尾,调用getActivity().startPostponedEnterTransition()
当然,这假设您已经完成了共享元素过渡所需的所有其他操作,但我相信这些方法就是您在问题中寻找的内容。
感谢@alex-lockwood的博客,向我展示了光明。

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