在 Android Lollipop 中,Activity#postponeEnterTransition()
和Activity#startPostponedEnterTransition()
方法使 Activity 能够延迟开始进入和退出共享元素转换,直到加载所有数据。这些非常适合Activity
过渡。
Fragment
有没有办法在使用过渡时达到相同的效果?
在 Android Lollipop 中,Activity#postponeEnterTransition()
和Activity#startPostponedEnterTransition()
方法使 Activity 能够延迟开始进入和退出共享元素转换,直到加载所有数据。这些非常适合Activity
过渡。
Fragment
有没有办法在使用过渡时达到相同的效果?
Fragment Transitions 中没有直接的等价物,因为 Fragment 使用 FragmentTransaction,我们不能真正推迟应该在事务中发生的事情。
要获得等价物,您可以添加一个 Fragment 并将其隐藏在事务中,然后当 Fragment 准备好时,删除旧的 Fragment 并在事务中显示新的 Fragment。
getFragmentManager().beginTransaction()
.add(R.id.container, fragment2)
.hide(fragment2)
.commit();
稍后,当 fragment2 准备好时:
getFragmentManager().beginTransaction()
.addSharedElement(sharedElement, "name")
.remove(fragment1)
.show(fragment2)
.commit();
您可以通过执行以下操作来推迟 Fragment 的进入转换:
允许FragmentTransaction
重新排序和优化交易
requireActivity().supportFragmentManager
.beginTransaction()
.replace(R.id.container, fragmentB)
.addSharedElement(view, "transitionName")
.setReorderingAllowed(true) // Set to true
.commit()
告诉fragmentB在视图创建后延迟过渡
class TransitionToFragment : Fragment(R.layout.fragment_b) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
postponeEnterTransition() // Don't start enter transitions yet!
... // Setup your views
(view.parent as? View)?.doOnPreDraw { startPostponedEnterTransition() } // Ok, start transitions
}
}
view.parent.doOnPreDraw { ... }
用于确保片段的视图被测量并为过渡布局。有关详细信息,请参阅Chris Banes 的博客。