ExoPlayer技术问询:如何判断控制器是否显示以实现切换功能?
实现ExoPlayer PlayerView的控制器切换(toggle)功能
其实要实现控制器的显示/隐藏切换,核心就是先判断当前控制器的可见状态,再调用对应的showController()或hideController()方法。下面分两种常用语言给你具体的实现方案:
第一步:判断控制器的当前可见状态
PlayerView的控制器本质是PlayerControlView,你可以通过playerView.getController()获取它的实例,然后通过视图可见性来判断状态:
- 当控制器的
getVisibility()返回View.VISIBLE时,说明当前处于显示状态; - 返回
View.GONE或View.INVISIBLE时,则处于隐藏状态。
哪怕你用了自定义控制器布局(通过XML的app:controller_layout_id或代码setControllerLayoutId()指定),这个判断逻辑依然有效——因为自定义布局最终会被加载到PlayerControlView内部,ExoPlayer会同步两者的可见状态。
第二步:实现toggleController方法
Kotlin 实现(简洁推荐)
给PlayerView写一个扩展函数,直接调用即可:
fun PlayerView.toggleController(animate: Boolean = true) { val controller = this.controller ?: return if (controller.visibility == View.VISIBLE) { this.hideController(animate) } else { this.showController(animate) } }
使用示例:
// 默认带动画切换 player_view.toggleController() // 不带动画切换 player_view.toggleController(animate = false)
Java 实现
可以写一个静态工具类方法:
public class ExoPlayerHelper { // 带动画的切换方法 public static void toggleController(PlayerView playerView) { toggleController(playerView, true); } // 可控制是否带动画的重载方法 public static void toggleController(PlayerView playerView, boolean animate) { PlayerControlView controller = playerView.getController(); if (controller == null) return; if (controller.getVisibility() == View.VISIBLE) { playerView.hideController(animate); } else { playerView.showController(animate); } } }
使用示例:
// 默认带动画 ExoPlayerHelper.toggleController(playerView); // 不带动画 ExoPlayerHelper.toggleController(playerView, false);
额外注意事项
- 如果你设置了控制器自动隐藏(比如XML里的
app:show_timeout属性),切换操作不会干扰这个自动隐藏逻辑,之后控制器依然会按照设定的超时时间自动隐藏。 - 自定义控制器布局的可见性会被ExoPlayer内部自动同步到PlayerControlView,不需要你额外处理状态同步问题。
内容的提问来源于stack exchange,提问作者chowey
相关产品推荐
相关产品推荐

