如何在Leanback BrowseFragment中实现两个PageRow的过渡动画?
解决Leanback BrowseFragment PageRow切换时的淡入淡出过渡问题
你遇到的setEntranceTransitionState未被调用、切换时内容区短暂空白的问题,主要是因为过渡配置不完整,以及没有正确响应Leanback的过渡回调逻辑。下面是一步步可落地的解决方案:
1. 给自定义Fragment配置基础过渡动画
在你的GuideFragment(以及另一个PageRow对应的Fragment)的onCreate方法中,先启用过渡并设置淡入淡出效果,同时开启过渡重叠避免空白:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 启用Fragment过渡支持 enterTransition = Fade() exitTransition = Fade() // 允许新旧Fragment过渡重叠,消除中间空白 allowEnterTransitionOverlap = true allowReturnTransitionOverlap = true }
2. 正确实现MainFragmentAdapter的回调
你之前的代码里错误地调用了fragment.setEntranceTransitionState(state),实际上这个回调是Leanback用来通知Fragment控制过渡时机的,我们需要根据state来启动或暂停过渡:
class GuideFragment : Fragment(), BrowseFragment.MainFragmentAdapterProvider { private val fragmentAdapter = object : BrowseFragment.MainFragmentAdapter<GuideFragment>(this) { override fun setEntranceTransitionState(state: Boolean) { Log.v("TEST", "setEntrance($state)") if (state) { // 启动入场过渡 startPostponedEnterTransition() } else { // 暂停过渡,等待视图完全准备好 postponeEnterTransition() } } } override fun getMainFragmentAdapter() = fragmentAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 视图加载完成后,启动延迟的过渡 startPostponedEnterTransition() } }
3. 让BrowseFragment启用主Fragment过渡
在承载PageRow的BrowseFragment中,必须开启主Fragment的过渡支持,否则不会触发setEntranceTransitionState回调:
class MainBrowseFragment : BrowseFragment() { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) // 启用主Fragment的过渡功能 isMainFragmentTransitionsEnabled = true // 初始化你的PageRow数据 setupPageRows() } private fun setupPageRows() { val rowsAdapter = ArrayObjectAdapter(ListRowPresenter()) // 添加第一个PageRow rowsAdapter.add(ListRow(HeaderItem(0, "页面1"), ArrayObjectAdapter(PageRowPresenter()).apply { add(GuideFragment()) })) // 添加第二个PageRow rowsAdapter.add(ListRow(HeaderItem(1, "页面2"), ArrayObjectAdapter(PageRowPresenter()).apply { add(AnotherPageFragment()) })) adapter = rowsAdapter } }
4. 额外注意事项
- 如果你的Fragment有异步加载数据/视图的逻辑,一定要在加载完成后调用
startPostponedEnterTransition(),否则过渡会一直等待,反而导致更长时间的空白。 - 自定义
PageRowPresenter时,不要禁用过渡相关逻辑,默认的Presenter已经支持过渡,除非你有特殊需求否则无需修改。
这样配置后,切换两个PageRow时就能实现无缝的淡入淡出过渡,setEntranceTransitionState也会被正常调用,完美解决短暂空白的问题。
内容的提问来源于stack exchange,提问作者tmm1
相关产品推荐
相关产品推荐

