安卓 - Recyclerview 共享元素转场中的元素位置

16

我希望你能帮我解决这个问题。我有两个片段,第一个是一个包含多张图片的recyclerview,第二个是这些图片的详细信息视图。如果用户点击一张图片,应用程序将进行片段转换并显示详细信息。

我已经成功地在片段之间实现了共享元素过渡,在第一个片段中点击小图片后,它会变大,并移动到详细视图的最终位置。

好的,接下来是问题,图片的初始位置不是预期的位置,当我点击图片时,它会向右和向下跳动几个像素。

为什么会出现这种情况?这很烦人!

过渡xml:

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

如果我对位于RecyclerView之外的按钮执行相同的操作,它可以完美地工作。这是RecyclerView中的某种错误吗?


我也希望对此进行澄清,因为今天我遇到了类似的问题。 - AndyRoid
@AndyRoid 如果你找到了解决方法,请告诉我们。 - Istigar
1
你能否发布你正在使用的任何相关代码?同时,一个展示问题的视频可能会有所帮助(Android Studio的屏幕捕获功能在这里非常方便)。 - Alex Lockwood
6个回答

15

在RecyclerView中,您的项目需要在共享视图上设置唯一的转换名称。如果您想象一下RecyclerView的渲染布局层次结构,其中会有许多具有相同转换名称的项目(视图)。这样,转换就不清楚实际共享元素是哪一个。例如,您可以将位置附加到视图的转换名称上,例如transition1,transition2等。现在,当您启动详细信息片段时,您必须将转换名称传递给它,并在详细信息片段中的共享视图中设置此名称,例如在onViewCreated()方法中。


7

如果您的recycler视图没有选择正确的视图,则可能会发生这种情况。确保使用精确的视图(基于位置)而不是根视图。例如,在下面的代码片段中,应该使用接收到的View v(在onClick()中),如下所示:

mAdapter.setOnItemClickListener(

                new MyAdapter.OnItemClickListener() {

                    @Override
                    public void onClick(View v, int position) {

                        ImageView heroView;
                        heroView = (ImageView) v.findViewById(R.id.category_icon);
                        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                                getActivity(), heroView, heroView.getTransitionName());
                        ActivityCompat.startActivity(getActivity(), intent, options.toBundle());

2
如果你的共享元素是ImageView,那么你需要使用一个ChangeImageTransform转换。尝试在你的转换集中添加<changeImageTransform />

2
谢谢你的帮助,但我已经尝试了很多过渡组合,结果仍然一样。 - Istigar

1
我通过阅读这篇文章Shared Element Transitions - Part 4: RecyclerView解决了这个问题。该文章提供了代码片段和详细的解释。
请确保共享元素之间的android:transitionName必须相同,并且在视图层次结构中也必须唯一
对于RecyclerViewFragment的情况,如果我们在XML中设置transitionName,则画廊中的所有ImageView都将具有相同的名称,这意味着当我们回到画廊时,框架无法确定要将图像移动到哪里。
由于项目位置是唯一的,因此最好在onBindViewHolder中使用位置设置transitionName。

0

对于其他遇到这些问题的人,我解决了它,方法是确保相同的图像转换应用于共享元素。在我的情况下,我没有将任何转换应用于我的 fragment2,而将中心裁剪应用于我的 fragment1,导致了视觉错误。


0

你可以在 style->theme 中删除 item name="android:windowFullscreen"true。这对我很有用。


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