我在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();
}
我在此主题上找到了Screen Video博客,http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html非常有帮助,但无法解决问题。
我对每次过渡的理解可能是个问题? 以下是我的理解方式。
我的mCurrentFragment
和newFragment
各有5个不同的过渡制定者:
setSharedElementEnterTransition
设置将用于传输到内容场景中的共享元素的Transition。setSharedElementReturnTransition
设置将用于在后台堆栈的弹出期间传回的共享元素的转换。setEnterTransition
设置将用于将视图移动到初始场景的Transition。setExitTransition
设置当不弹出后台时删除,隐藏或分离片段时用于将视图移出场景的Transition。setReenterTransition
设置由于弹出后台而在返回时用于将视图移动到场景中的过渡。调用我的setFragment
方法时,会播放一个动画,从mCurrentFragment
转换为newFragment
并具有以下属性:
newFragment
SharedElementEnterTransition定义共享元素将如何转换为newFragment
。newFragment
EnterTransition定义了非共享元素的剩余newFragment
子视图将如何转换到屏幕上。mCurrentFragment
ExitTransition定义了非共享元素的mCurrentFragment
子视图将如何从屏幕上转换。mCurrentFragment
只包含RecyclerView,因此效果是其余的RecyclerView元素在后台逐渐消失)当弹出BackStack时,我希望会发生以下情况:
mCurrentFragment
的SharedElementReturnTransition定义共享元素将如何转换回mCurrentFragment
。newFragment
的ExitTransition定义了非共享元素的newFragment
子视图将如何从屏幕过渡。mCurrentFragment
的ReenterTransition定义了非共享元素的剩余mCurrentFragment
子视图将如何转换回屏幕。我误解了什么吗?