如何实现安卓Fragment间视频共享元素转场且不中断音视频播放
基于ExoPlayer的Fragment共享元素视频转场无中断实现方案
核心逻辑
普通静态内容共享元素转场仅过渡View绘制缓存,不适用于视频、GIF等动态内容,要实现全程播放无中断,核心逻辑是播放实例全局复用、仅切换渲染载体、配合系统共享元素动画完成过渡,YouTube TV端的实现也是基于该逻辑。
具体实现步骤
- 全局持有唯一ExoPlayer实例,不要在Fragment A/B内部初始化播放器,切换Fragment时不会触发播放器的销毁、重建逻辑,音频输出会全程保持正常。
- 给Fragment A中承载视频的View和Fragment B中承载视频的View设置相同的
transitionName,跳转时将该View作为共享元素传入FragmentTransaction,系统会自动执行缩放、位移的过渡动画。 - 转场触发前仅调用
player.clearVideoSurface()将播放器与Fragment A的渲染Surface解绑,不要调用pause()/stop()/release()等控制播放状态的方法。 - 给Fragment B设置共享元素转场完成监听,在动画结束回调中,将全局ExoPlayer重新绑定到Fragment B的渲染Surface上即可。
通用动态媒体适配
针对GIF、直播流等其他动态媒体场景,实现逻辑一致:仅将对应的渲染引擎(比如GIF加载框架的解码实例)做全局单例管理,转场过程中不销毁渲染实例,仅在转场完成后切换渲染承载的View即可。
避坑提示
不要给两个Fragment的共享元素View设置额外背景,否则转场过程中会出现黑边遮挡视频画面的问题。
TV端场景需要在转场过程中临时持有焦点锁,避免转场时焦点乱跑触发播放暂停的异常逻辑。
内容的提问来源于stack exchange,提问作者Felix ZY
相关产品推荐
相关产品推荐

