【问题标题】:Android - Recyclerview shared element transition item positionAndroid - Recyclerview 共享元素过渡项位置
【发布时间】:2015-02-24 11:28:27
【问题描述】:

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

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

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

为什么会这样?真烦人!

过渡 xml:

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

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

【问题讨论】:

  • 也想澄清一下,因为我今天遇到了类似的问题
  • @AndyRoid 如果您找到解决方法,请告诉我们
  • 您可以发布您正在使用的任何相关代码吗?说明问题的视频也可能会有所帮助(Android Studio 的屏幕捕获功能可以在这里派上用场)。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果没有从您的回收站视图中获取正确的视图,则可能会发生这种情况。确保使用精确视图(基于位置)而不是根视图。例如在下面的 sn-p 中,应使用 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());
    

    【讨论】:

      【解决方案3】:

      如果您的共享元素是ImageViews,那么您还需要使用ChangeImageTransform 转换。尝试将&lt;changeImageTransform /&gt; 添加到您的转换集。

      【讨论】:

      • 感谢您的帮助,但我尝试了很多过渡组合,结果仍然相同。
      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          您可以删除style->主题中的item name="android:windowFullscreen"true。它对我很有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-04
            • 1970-01-01
            • 1970-01-01
            • 2016-04-23
            • 2018-07-14
            • 1970-01-01
            相关资源
            最近更新 更多