Android TV:如何用D-pad控制ExoPlayer中360全景视频旋转而非播放器
解决Android TV上D-pad控制360全景视频视角的问题
你当前的代码是直接旋转PlayerView的Surface容器,这只会让播放器整体旋转,而非调整全景视频的视角。要实现D-pad控制全景视频的朝向,需要操作SphericalGLSurfaceView的视角参数,而非Surface的旋转属性。
解决方案步骤:
- 获取
SphericalGLSurfaceView实例:因为XML中设置了surface_type="spherical_gl_surface_view",playerView.videoSurfaceView实际是SphericalGLSurfaceView对象,可直接强转。 - 使用
setView()调整视角:该方法接收三个核心参数:yaw:水平旋转角度(左右移动对应此参数)pitch:垂直旋转角度(上下移动可调整此参数)zoom:缩放级别(默认1.0即可)
- 控制角度范围:将yaw限制在0-360度、pitch限制在-90到90度之间,避免数值溢出导致画面异常。
修改后的代码:
private lateinit var playerView: PlayerView private lateinit var player: ExoPlayer private var yawDegrees = 0f // 初始化水平视角为0度 private var pitchDegrees = 0f // 初始化垂直视角为0度 override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { when (keyCode) { KeyEvent.KEYCODE_DPAD_LEFT -> { yawDegrees -= 10f if (yawDegrees < 0) yawDegrees += 360f updatePanoramaView() return true } KeyEvent.KEYCODE_DPAD_RIGHT -> { yawDegrees += 10f if (yawDegrees > 360) yawDegrees -= 360f updatePanoramaView() return true } KeyEvent.KEYCODE_DPAD_UP -> { pitchDegrees += 5f pitchDegrees = pitchDegrees.coerceIn(-90f, 90f) updatePanoramaView() return true } KeyEvent.KEYCODE_DPAD_DOWN -> { pitchDegrees -= 5f pitchDegrees = pitchDegrees.coerceIn(-90f, 90f) updatePanoramaView() return true } } return super.onKeyDown(keyCode, event) } private fun updatePanoramaView() { val sphericalSurface = playerView.videoSurfaceView as? SphericalGLSurfaceView sphericalSurface?.setView(yawDegrees, pitchDegrees, 1.0f) }
关键说明:
- 不要用
playerView.videoSurfaceView?.rotation调整视角,这是旋转整个播放器容器,和全景视频的内部视角无关。 setView()是SphericalGLSurfaceView专门用于控制全景视频相机朝向的API,修改这个参数才会真正改变用户看到的视频内容视角。
内容的提问来源于stack exchange,提问作者Asad
相关产品推荐
相关产品推荐

