【问题标题】:Shared element transition among fragments that belong to different activities in Android lollipopAndroid棒棒糖中属于不同活动的片段之间的共享元素转换
【发布时间】:2014-12-17 11:35:13
【问题描述】:

我在属于一个 Activity 的片段中有一个共享元素。

我想在 Android Lollipop 中使用属于另一个活动的片段的一部分的元素进行共享元素转换。

有可能吗?

我怎样才能做到这一点?

【问题讨论】:

    标签: android animation android-fragments android-animation android-5.0-lollipop


    【解决方案1】:

    这是可能的。

    首先,当您在片段中检测到即将发生转换时,构建一个 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");
    

    希望对你有帮助

    【讨论】:

    • 它不工作......我应该也使用 addSharedElement(查看 sharedElement,字符串名称)吗?在被调用的活动中,我有一个带有寻呼机的片段和一个片段。会不会是问题?
    • 哦,您的片段嵌入在 ViewPager 中?我也遇到了这个问题,我无法让它工作。
    • 在第二个片段布局中的共享视图上设置 android:transitionName="THUMBNAIL_IMAGE" 也有效。我还发现此解决方案仅适用于在父 XML 中静态声明的片段,而不适用于动态添加的片段。
    • @extmkv 据我记得动画在两个方向都有效
    • 我发现了问题@Katharina!事务应该在activity::onStart之前进行
    【解决方案2】:

    更新:截至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 向我展示了光明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2018-07-30
      • 2015-04-18
      • 2016-11-18
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多