反向共享元素转换

Jos*_*osh 6 android transition shared-element-transition

我目前正在使用以下代码将屏幕右侧的块转换为左侧的共享元素:

 FragmentDetail newFragment = FragmentDetail.newInstance(id);

 setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.trans_move));
 setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));
 View block = view.findViewById(R.id.blocks);
 block.setTransitionName("block");

 newFragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.trans_move));
 newFragment.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));


 newFragment.setTransitionId(block.getTransitionName());
 FragmentTransaction trans = getFragmentManager().beginTransaction();
 trans.replace(R.id.container, newFragment);
 trans.addToBackStack(null);
 trans.addSharedElement(block, block.getTransitionName());
 trans.commit();
Run Code Online (Sandbox Code Playgroud)

这正是我想要的方式,但是我希望在按下后退按钮时反转效果,将项目重新设置为动画.原样,爆炸动画播放,但过渡不会.

任何帮助是极大的赞赏.

谢谢乔希

Joe*_*ler 7

带有 Android 导航组件的 KOTLIN

对于在使用 Android 导航组件时在这里寻找此问题答案的任何人,您可以通过将这些行添加到起始片段的 onViewCreated 函数来使反向过渡动画工作:

        postponeEnterTransition()
        view.doOnPreDraw { startPostponedEnterTransition() }
Run Code Online (Sandbox Code Playgroud)

如果您通过单击 RecyclerView 项目打开第二个片段,您通常会使用它。


Ale*_*ood 4

假设您有两个片段AB,并A提交一个片段事务来启动片段B

那么这意味着退出和重新进入转换应设置为 on A,进入和返回转换应设置为 on B

看起来您正在调用setSharedElementReturnTransition调用片段而不是被调用片段(newFragment在本例中为 ),这可能会导致问题。

顺便说一句,您应该考虑在片段的方法中调用set*****Transition()和方法,而不是在提交片段事务之前立即调用。如果一个片段被破坏并重新创建,这些过渡将被忘记......所以将它们设置起来更安全。setSharedElement*****Transition()onCreate()onCreate()