Fragment ReenterTransition无效。需要帮助澄清各种片段转换

时间:2015-07-08 04:14:05

标签: android fragment-transitions

我在RecyclerView中的项目之间实现Fragment过渡动画,以及显示所点击项目细节的片段。换句话说,比较常见......

"单击列表中的卡片,当列表的其余部分消失时,它会扩展为详细视图"

......有点事。

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

但是,当弹出BackStack时,共享元素会转换回旧状态,但其他RecyclerView项目不会淡入。它们会立即出现在动画的开头,正如您在此处所看到的{{ 3}}

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

@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();
}
  • 我尝试过在允许/不允许进入/返回时转换重叠。
  • 我尝试过使用Fragments的各种过渡设置方法。
  • 我已经阅读了大量关于此主题的博客和SO问题。

我在此主题上找到了Screen Video博客,http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html非常有帮助,但无法解决问题。

我对每次过渡的理解可能是个问题? 以下是我的理解方式。

我的mCurrentFragmentnewFragment各有5个不同的过渡制定者:

  1. setSharedElementEnterTransition设置将用于传输到内容场景中的共享元素的Transition。
  2. setSharedElementReturnTransition设置将用于在后台堆栈的弹出期间传回的共享元素的转换。
  3. setEnterTransition设置将用于将视图移动到初始场景的Transition。
  4. setExitTransition设置当不弹出后台时删除,隐藏或分离片段时用于将视图移出场景的Transition。
  5. setReenterTransition设置由于弹出后台而在返回时用于将视图移动到场景中的过渡。
  6. 调用我的setFragment方法时,会播放一个动画,从mCurrentFragment转换为newFragment并具有以下属性:

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

    当弹出BackStack时,我希望会发生以下情况:

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

    我误解了什么吗?

0 个答案:

没有答案