【发布时间】:2014-12-17 11:35:13
【问题描述】:
我在属于一个 Activity 的片段中有一个共享元素。
我想在 Android Lollipop 中使用属于另一个活动的片段的一部分的元素进行共享元素转换。
有可能吗?
我怎样才能做到这一点?
【问题讨论】:
标签: android animation android-fragments android-animation android-5.0-lollipop
我在属于一个 Activity 的片段中有一个共享元素。
我想在 Android Lollipop 中使用属于另一个活动的片段的一部分的元素进行共享元素转换。
有可能吗?
我怎样才能做到这一点?
【问题讨论】:
标签: android animation android-fragments android-animation android-5.0-lollipop
这是可能的。
首先,当您在片段中检测到即将发生转换时,构建一个 Pair<View, String> 数组,并在其中填充视图和转换名称。
例如,如果您想从缩略图图像动画到全宽图像:
Pair[] pairs = new Pair[1];
pairs[0] = new Pair(thumbnailImage, "THUMBNAIL_IMAGE");
其次,将该数组传递给片段的活动,以便它可以启动实际的转换。 (我正在使用 Otto 来传递该事件,如果您愿意,可以使用通常的回调)。
然后,在您的活动中,开始第二个活动。 (我为此创建了一个简单的方法)
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() 方法中,您可以调用:
ViewCompat.setTransitionName(fullWidthImage, "THUMBNAIL_IMAGE");
希望对你有帮助
【讨论】:
更新:截至v25.1.1 of the support library,这些相同的方法在支持片段中。文档链接:Fragment.postponeEnterTransition() 和 Fragment.startPostponedEnterTransition()
原始答案:
这是可能的,即使在第二个 Activity 中动态添加了 Fragment。
您只需要告诉第二个 Activity 在布局和测量共享元素之前不要运行其过渡动画。
在第二个活动调用postponeEnterTransition() 的onCreate 中(或supportPostponeEnterTransition(),如果您使用的是支持库)。将您的 Fragment 动态添加到此 Activity。在您动态添加的片段中的onCreateView 方法的末尾,调用getActivity().startPostponedEnterTransition()。
这当然假设您已经完成了共享元素转换所需的所有其他操作,但我相信这些方法正是您正在寻找的问题。
感谢@alex-lockwood 的blog 向我展示了光明。
【讨论】: