在片段之间动画的共享元素

时间:2014-11-15 21:14:38

标签: android android-fragments android-recyclerview shared-element-transition fragment-transitions

我试图将RecyclerView中所选项目的2个简单视图设置为新片段。我已经查看了很多将共享元素从一个Activity动画到另一个Activity的示例,但很少有动画将共享元素从一个Fragment动画到同一个Activity中的另一个Fragment的例子。它几乎可以工作。

这是我的结构。

活动

- 使用RecyclerView的全屏Fragment1

- 带有详细信息的全屏Fragment2

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

要使其工作有一些技巧,你必须确保你的transitionName对于列表中的每个项都是唯一的,当然,transitionName必须与Fragment2中元素的transitionName匹配。动画播放。我有这个部分工作,当我选择一个项目时,2个共享视图会进行动画制作,而不是在两个活动之间进行动画时的预期。

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

片段1 Select item near bottom of list

Fragment2 I would expect the blue line to animate from the bottom to the top, but it starts at the top and only grows horizontaly, the yellow line I would expect to stay near the bottom but grow horizontally, but it starts at the top of the screen and animates down

在两个片段中我都设置了以下

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

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

        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

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

1 个答案:

答案 0 :(得分:37)

终于解决了这个问题!事实证明,因为我在2个片段之间共享的视图是第二个片段中另一个视图(RelativeLayout)的子视图,所以需要将ChangeTransform过渡添加到TransitionSet。显然,ChangeTransform告诉系统在动画到第二个片段中的新位置之前,记住第一个片段中的视图原始位置。这是我更新的transitionSet。我还会稍微清理我的测试项目代码并最终推送到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