Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在片段之间设置动画的共享元素_Android_Android Fragments_Android Recyclerview_Shared Element Transition_Fragment Transitions - Fatal编程技术网

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

Android 在片段之间设置动画的共享元素,android,android-fragments,android-recyclerview,shared-element-transition,fragment-transitions,Android,Android Fragments,Android Recyclerview,Shared Element Transition,Fragment Transitions,我正在尝试将两个简单视图从RecyclerView中的选定项设置为新片段的动画。我已经看过很多将共享元素从一个活动动画化到另一个活动的例子,但是很少有在同一个活动中将共享元素从一个片段动画化到另一个片段的例子。它几乎起作用了 这是我的结构 活动 -带RecyclerView的全屏碎片1 -全屏片段2和详细信息 当用户在Fragment1中的RecyclerView中选择一个项目时,我将Fragment1替换为Fragment2,该Fragment2具有一个视图,其中的共享元素处于不同的位置和大小

我正在尝试将两个简单视图从RecyclerView中的选定项设置为新片段的动画。我已经看过很多将共享元素从一个活动动画化到另一个活动的例子,但是很少有在同一个活动中将共享元素从一个片段动画化到另一个片段的例子。它几乎起作用了

这是我的结构

活动

-带RecyclerView的全屏碎片1

-全屏片段2和详细信息

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

有一个小技巧可以让它工作,你必须确保你的transitionName对于列表中的每个项目都是唯一的,当然transitionName必须与Fragment2中元素的transitionName匹配才能播放动画。我让这部分工作,当我选择一个项目,两个共享视图做动画,只是不完全是你所期望的,当你在两个活动之间做它

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

片段1

碎片2

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

        setSharedElementEnterTransition(new ChangeBounds());
        setSharedElementReturnTransition(new ChangeBounds());
        setAllowEnterTransitionOverlap(true);
        setAllowReturnTransitionOverlap(true);
也在我设置的onCreate中的父活动中

        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

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

终于解决了这个问题!事实证明,因为我在两个片段之间共享的视图是第二个片段中另一个视图RelativeLayout的子视图,所以需要将ChangeTransform转换添加到TransitiveSet中。显然,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>

我不确定我是否理解你想要实现的目标。我猜奇怪的黄/蓝条就是你所指的视图?因此,在您的第一个屏幕截图中,您单击该项目,您希望两个相应的黄色/蓝色条动画显示在第二个片段中黄色/蓝色条的位置。。。但是会发生什么呢?你是什么意思…它为Fragment2绘制视图,并为这两个共享视图设置动画,就像它们在屏幕顶部的项目中一样?另外,第二个屏幕截图中的箭头代表什么?顺便说一句,如果你使用Android Studio,你可以很容易地获取应用程序的屏幕截图,并将其上传到YouTube。我知道解释问题一定很困难。最后一个问题:这种行为是否只发生在你选择屏幕底部的项目时?例如,对于顶部的项目,它会像预期的那样工作吗?是的,如果我在列表底部选择一个项目,我希望蓝色和黄色条从屏幕底部开始设置动画。蓝色的将向上平移y轴,向下缩放y轴,同时向上缩放x轴,最终到达屏幕顶部的最终水平位置。黄色条也是一样,只是它不会平移太远,因为它已经在屏幕的底部,它通常只会向下缩放x轴,向上缩放y轴,以水平填充屏幕的底部。我现在正在上传一段视频到youtube上,到时候我会用坐标系来解释。因为Fragment 1是一个全屏的RecyclerView,包含一堆项目。当我点击一个项目并加载我的片段2时,它的动画就好像它使用了项目视图的局部坐标,而不是父项的RecyclView视图。因此,如果我选择最后一项,黄色条可能从其局部坐标系的750,0开始,但是,在父视图中,它实际上类似于7501000,因为它位于列表的底部。嗯。。。哇!很高兴你终于明白了。肯定没想到会有这样的解决办法谢谢!片段是否需要有一个框架布局?我一直很困惑,因为我在两个片段之间共享的视图是另一个视图RelativeLayout的子视图,在第二个片段中,@brockoli,我在尝试相同的事情-只是这两个片段处于不同的活动中。在这种情况下,您的代码不起作用。你知道在那种情况下该怎么办吗?