Android 材料设计父子导航转换recyclerview条目到详图片段

Android 材料设计父子导航转换recyclerview条目到详图片段,android,android-fragments,android-recyclerview,material-design,android-transitions,Android,Android Fragments,Android Recyclerview,Material Design,Android Transitions,背景 我正在尝试实现“父到子”导航转换,特别是当您单击Recyclerview条目,详细信息显示在全屏片段中时。大概是这样的: 问题 有这么多可用的动画API,我该怎么做呢?(TransitionManager.beginDelayedTransition、SharedTransition、setExitTransition等) 我尝试过的 -这符合我的要求,但它似乎仅在详图视图与Recyclerview处于相同布局时才起作用。因为我使用片段backstack在片段之间导航,所以我需要它在连

背景

我正在尝试实现“父到子”导航转换,特别是当您单击Recyclerview条目,详细信息显示在全屏片段中时。大概是这样的:

问题

有这么多可用的动画API,我该怎么做呢?(TransitionManager.beginDelayedTransition、SharedTransition、setExitTransition等)

我尝试过的

  • -这符合我的要求,但它似乎仅在详图视图与Recyclerview处于相同布局时才起作用。因为我使用片段backstack在片段之间导航,所以我需要它在连接之前可能不可用的布局之间转换

  • -答案仅涵盖活动到活动的转换。我在寻找一个个碎片

  • 自定义转换-我尝试扩展转换类,但遇到了问题。CaptureStartValues()似乎从整个场景中捕获值。我需要它只从recyclerview条目中捕获值。此外,由于某些原因,当我在函数createAnimator(ViewGroup sceneRoot、TransitionValues startValues、TransitionValues endValues)中获得null endValues时,不会捕获结束值


您应该在此处使用共享元素转换。将有两个共享元素:您的RecyclerView的项目背景和文本视图(例如)。您的RecyclerView的项目背景应该延伸到第二个片段的背景(您需要使用
ChangeTransform
ChangeBounds
转换),并且您的文本视图应该移动到第二个片段的标题。您应该为共享元素转换使用动画:首先,您应该提升RecyclerView的项目背景,然后开始拉伸背景并移动标题,最后,您应该将提升设置回正常状态。请注意,您的第一个片段应该一直可见,因此您应该为其设置退出持续时间:
fragment1.setExitTransition(new Fade().setDuration(1.setStartDelay())


所以这里的主要目标是使用SharedElement转换。有一个非常好的aboud SharedElement片段到片段的转换。

谢谢。你的建议在很大程度上很有效。不幸的是,当我尝试设置一个不褪色的自定义exitTransition时(我希望像gif中那样使fragment1变暗),即使使用setduration和setstartdelay,第一个片段也不再可见。我想我会为此再写一篇文章。
TransitionSet exitTransition = new TransitionSet()
        .addTransition(new ChangeBounds())
        .addTransition(new ChangeTransform())
        .addTransition(new ChangeClipBounds())
        .addTransition(new ChangeImageTransform())
        .addTransition(new Expand())
        .setOrdering(TransitionSet.ORDERING_TOGETHER);
TransitionSet enterTransition = new TransitionSet()
        .addTransition(new Fade());
newFragment.setEnterTransition(enterTransition);
oldFragment.setExitTransition(exitTransition);