Android - Recyclerview共享元素转换项目位置

时间:2015-02-24 11:28:27

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

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

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

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

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

转换xml:

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

如果我对Recyclerview以外的按钮执行相同操作,则效果非常好。这是Recyclerview中的某种错误吗?

6 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

如果未从回收站视图中拾取正确的视图,则可能会发生这种情况。确保使用精确视图(基于位置)而不是根视图。对于例如在下面的代码片段中,应使用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 :(得分:2)

如果您的共享元素为ImageView,那么您还需要使用ChangeImageTransform转换。尝试将<changeImageTransform />添加到转换集。

答案 3 :(得分:1)

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

  

确保共享元素之间的RecyclerView必须是相同,并且还必须在视图层次结构中是唯一的

     

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

由于项目位置是唯一的,因此最好使用此处的位置在xls_file = Roo::Excelx.new('test.xlsx') CSV.open('test.csv') do |csv| (2..xls_file.last_row).each do |i| # if you do not need header otherwise (1..xls_file.last_row) csv << a.row(i) end end 中设置transitionName。

答案 4 :(得分:0)

对于其他遇到这些问题的人,我通过确保将相同的图像转换应用于两个共享元素来解决了该问题。就我而言,我没有对我的fragment2进行任何转换,而对我的fragment1进行了中央裁剪,从而导致了视觉错误。

答案 5 :(得分:0)

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