16

我希望你能帮助我解决这个问题。我有两个片段,第一个是带有几张图像的回收视图,第二个片段是这些图像的详细信息视图。如果用户单击图像,应用程序会执行片段事务并显示详细信息。

我已经成功实现了片段之间的共享元素转换,如果我单击第一个片段上的小图像,它会变大并移动到详细信息视图上的最终位置。

那么,问题来了,图像的初始位置不是预期的,它开始从其原始位置移动几个像素,当我单击图像时,图像会向右和底部跳跃一点。

为什么会这样?这很烦人!

过渡xml:

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

如果我对 recyclerview 之外的按钮执行相同的操作,它会完美运行。这是recyclerview中的某种错误吗?

4

6 回答 6

15

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

于 2015-06-26T11:31:14.600 回答
7

如果没有从您的回收站视图中获取正确的视图,则可能会发生这种情况。确保使用精确视图(基于位置)而不是根视图。例如,在下面的代码片段中,应使用 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());
于 2016-01-22T13:51:00.930 回答
2

如果您的共享元素是ImageViews,那么您还需要使用ChangeImageTransform过渡。尝试添加<changeImageTransform />到您的过渡集。

于 2015-02-25T03:11:41.863 回答
1

我按照这篇文章Shared Element Transitions - Part 4: RecyclerView解决了这个问题,它显示了代码片段并给出了详细的解释。

确保共享元素android:transitionName之间必须相同,并且在视图层次结构中也必须是唯一的。

至于RecyclerViewFragment如果我们transitionName在 XML 中设置,那么画廊中的所有 ImageView 将具有相同的,这意味着当我们回到画廊时,框架将不知道将图像移动到哪里。

由于 item 的位置是唯一的,所以这里最好使用 position 来设置 transitionName in onBindViewHolder

于 2017-07-04T17:12:01.137 回答
0

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

于 2021-07-03T01:39:02.113 回答
0

对于遇到这些问题的其他人,我通过确保将相同的图像转换应用于两个共享元素来解决它。在我的情况下,我没有对我的片段 2 应用任何转换,而对我的片段 1 应用中心裁剪,导致视觉错误。

于 2018-10-28T12:00:24.193 回答