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

20

我正在尝试从RecyclerView中选择的一个项目中动画2个简单视图到一个新的片段。我查看了很多关于在不同Activity之间动画共享元素的例子,但很少有关于在同一Activity中从一个片段动画共享元素的例子。它几乎可以工作。

这是我的结构:

活动

--全屏碎片1具有RecyclerView

--具有详细信息的全屏碎片2

当用户在Fragment1的RecyclerView中选择项时,我将Fragment1替换为带有不同位置和大小的共享元素视图的Fragment2。

要使其正常工作,需要注意确保您列表中每个项目的transitionName是唯一的,并且当然该transitionName必须与Fragment2中的元素的transitionName匹配才能播放动画。我已经让这部分工作了,当我选择一个项目时,这两个共享视图确实会以动画方式显示,只是与在两个Activities之间执行时的预期结果略有不同。

如果我选择靠近屏幕底部的项目,它会绘制Fragment2的视图,并像它们是在屏幕顶部的项目一样动画显示这两个共享视图。有点难解释。以下是一些图片:

Fragment1 选择靠近列表底部的项目

Fragment2 我希望蓝线从底部向上动画,但它从顶部开始仅水平增长,黄线我期望它保持在底部但是水平增长,但它从屏幕顶部开始并向下动画

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

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

在它们的父Activity的onCreate()方法中,我也进行了如下设置:

        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

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


如果你将你的示例项目发布到GitHub(或其他类似网站),我会很乐意查看。 - Alex Lockwood
非常感谢。我会很快将其放在Bitbucket上并公开。 - brockoli
没问题。我曾经遇到过与Activity转场类似的问题,并且通过使用Activity#postponeEnterTransition()Activity#startPostponedEnterTransition()解决了大部分问题...但是对于Fragment,没有等效的方法可用,所以我很好奇在使用Fragment转场时是否有不同的解决方法... - Alex Lockwood
你可以在这里获取我的测试项目,它位于Bitbucket上。https://bitbucket.org/brockoli/fragmentsharedelements - brockoli
很酷!我这个周末会看一下。 - Alex Lockwood
显示剩余15条评论
1个回答

38

终于解决了这个问题!事实证明,因为我在两个片段之间共享的视图是第二个片段中另一个视图(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


哦...哇。很高兴你终于想出来了。我绝对没有预料到那会是解决方案。 :) - Alex Lockwood
非常感谢!片段是否需要有一个FrameLayout?我一直对“事实证明,因为我在两个片段之间共享的视图是第二个片段中另一个视图(RelativeLayout)的子级”感到困惑。 - busylee
@brockoli,我正在尝试同样的事情 - 只是这两个片段位于不同的活动中。而你的代码在这种情况下不起作用。你知道在这种情况下该怎么办吗? - Anand Sainath
https://stackoverflow.com/questions/53179476/fragment-to-fragment-animation-with-shared-element-dont-work-as-expected - Phantom Lord

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