8

我正在 RecyclerView 中的项目之间实现 Fragment 过渡动画,以及显示单击项目详细信息的 Fragment。换句话说,相对常见的...

“单击列表中的卡片,它会展开为详细视图,而列表的其余部分会消失”

...之类的事情。

从 RecyclerView 项目到详细视图的转换工作正常。该项目的共享元素正在转换到它们的新状态,而其余的 RecyclerView 项目消失。

但是,当 BackStack 弹出时,共享元素会转换回它们的旧状态,但其他 RecyclerView 项不会淡入。相反,它们会在动画开始时立即出现,正如您在此屏幕视频中看到的那样

该活动处理相当多的片段,因此我使用以下通用方法进行事务:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void setFragment(int fragId, Bundle args, List<Pair> transitionViews,
        String tag, int containerId) {

    // Setup the new fragment and transaction
    Fragment newFragment = FragmentFactory.newFragment(fragId, args);
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(containerId, newFragment, tag);
    fragmentTransaction.addToBackStack(tag);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && transitionViews != null) {

        // Add the shared elements
        for (int i = 0; i < transitionViews.size(); i++) {
            final Pair pair = transitionViews.get(i);
            fragmentTransaction.addSharedElement((View) pair.first, (String) pair.second);
        }

        // Setup the transitions
        Transition transitionMove = TransitionInflater.from(this).inflateTransition(android.R.transition.move);
        Transition transitionFade = TransitionInflater.from(this).inflateTransition(android.R.transition.fade);
    //        transitionFade.setDuration(500);  // Slow down the transition to help see what's happening

        // Apply the relevant transitions to each fragment
        newFragment.setSharedElementEnterTransition(transitionMove);
        newFragment.setEnterTransition(transitionFade);
        newFragment.setExitTransition(transitionFade);
        mCurrentFragment.setExitTransition(transitionFade);
        mCurrentFragment.setReenterTransition(transitionFade);
        mCurrentFragment.setSharedElementReturnTransition(transitionMove);
    }

    fragmentTransaction.commit();
}
  • 我尝试过在 Enter/Return 上允许/禁止过渡重叠。
  • 我尝试过使用 Fragments 的各种过渡设置方法。
  • 我已经阅读了大量关于这个主题的博客和 SO 问题。

我发现http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html关于这个主题的博客,以及brockoli 的示例代码很有帮助,但一直无法解决问题。


也许这是我对每个过渡的理解的问题?
这是我的理解。

mCurrentFragmentnewFragment每个都有 5 个不同的转换设置器:

  1. setSharedElementEnterTransition设置将用于传输到内容场景的共享元素的转换。
  2. setSharedElementReturnTransition设置将用于在返回堆栈弹出期间传回的共享元素的转换。
  3. setEnterTransition设置将用于将视图移动到初始场景中的转换。
  4. setExitTransition设置当片段被移除、隐藏或在不弹出返回堆栈时分离时将用于将视图移出场景的转换。
  5. setReenterTransition设置由于弹出回栈而返回时将用于将视图移动到场景中的转换。

当我的setFragment方法被调用时,会播放一个动画,从mCurrentFragmentnewFragment具有以下属性:

  • SharedElementEnterTransitionnewFragment定义了共享元素将如何转换为newFragment.
    (在我的情况下,单击项目的 CardView 展开并且它包含的 TextView 之一被移动)
  • EnterTransitionnewFragment定义了剩余的非共享元素newFragment的子视图如何过渡到屏幕上。 (在我的情况下,工具栏在屏幕底部淡入。实际上,工具栏正在退出的 RecyclerView 后面淡入。有没有办法交换它所以它在前面?)
  • mCurrentFragmentExitTransition 定义了非共享元素mCurrentFragment的子视图将如何从屏幕过渡。 (在我的例子中只包含 RecyclerView,所以效果是其余的 RecyclerView 元素在后台逐渐消失)
    mCurrentFragment

当 BackStack 被弹出时,我预计会发生以下情况:

  • SharedElementReturnTransitionmCurrentFragment定义了共享元素如何转换回mCurrentFragment.
    (在我的情况下, CardView 收缩回 RecyclerView 项目大小,并且它包含的 TextView 被移回)。
  • ExitTransitionnewFragment定义了非共享元素newFragment的子视图如何从屏幕过渡。 (在我的情况下,底部工具栏淡出)
  • ReenterTransitionmCurrentFragment定义了剩余的不是共享元素mCurrentFragment的子视图将如何转换回屏幕。 (在我的情况下,其他 RecyclerView 项目应该淡出,但这没有发生。它们在过渡共享元素后面立即可见)。

我有什么误解吗?

4

0 回答 0