20

我正在尝试将 2 个简单视图从 RecyclerView 中的选定项目设置为新片段。我看过很多将共享元素从一个 Activity 动画化到另一个 Activity 的示例,但很少有将共享元素从一个 Fragment 动画化到同一 Activity 内的另一个 Fragment 的示例。它几乎可以工作。

这是我的结构。

活动

-- 带有 RecyclerView 的全屏 Fragment1

-- 带有细节的全屏 Fragment2

当用户在 Fragment1 的 RecyclerView 中选择一个项目时,我将 Fragment1 替换为 Fragment2,该 Fragment2 具有一个 View,其中的共享元素处于不同的位置和大小。

让它工作有一点技巧,你必须确保你的 transitionName 对于列表中的每个项目都是唯一的,当然,transitionName 必须与 Fragment2 中元素的 transitionName 匹配才能播放动画。我有这部分工作,当我选择一个项目时,2 个共享视图会进行动画处理,但这与您在 2 个活动之间执行它时所期望的不完全一样。

如果我选择屏幕底部附近的一个项目,它会为 Fragment2 绘制视图并为 2 个共享视图设置动画,就好像它们位于屏幕顶部的项目中一样。很难解释。这里有一些图片

片段1 选择列表底部附近的项目

片段2 我希望蓝线从底部到顶部动画,但它从顶部开始并且只水平增长,我希望黄线保持在底部附近但水平增长,但它从屏幕顶部开始并动画下来

在这两个片段中,我设置以下

        setSharedElementEnterTransition(new ChangeBounds());
        setSharedElementReturnTransition(new ChangeBounds());
        setAllowEnterTransitionOverlap(true);
        setAllowReturnTransitionOverlap(true);

同样在他们的 onCreate() 父 Activity 我已经设置

        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

知道为什么我的共享元素动画从屏幕顶部开始,即使它们从屏幕底部的选定项目开始?

4

1 回答 1

38

终于解决了这个问题!事实证明,因为我在 2 个片段之间共享的视图是第二个片段中另一个视图 (RelativeLayout) 的子视图,所以您需要将 ChangeTransform 转换添加到您的 TransitionSet。显然,ChangeTransform 告诉系统在动画到第二个片段中的新位置之前记住第一个片段中的视图原始位置。这是我更新的转换集。我还将稍微清理一下我的测试项目代码,并最终推动 bitbucket,以防它对我之后的其他人有所帮助。感谢 Alex 提供的所有帮助,并感谢 @George-mount 回答某人的类似问题,这些问题为我提供了此解决方案的提示。

<?xml version="1.0" encoding="utf-8"?>

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeTransform/>
    <changeBounds/>
</transitionSet>

https://bitbucket.org/brockoli/fragmentsharedelements

于 2014-11-30T14:28:47.943 回答