You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wear OS应用中GLSurfaceView旋转输入无响应问题求助

解决Wear OS中GLSurfaceView旋转表冠事件无响应的问题
  • 核心问题:你当前给Fragment请求焦点,但旋转事件需要GLSurfaceView本身获取焦点;同时Compose的onRotaryScrollEvent无法穿透到嵌套的原生GLSurfaceView,建议直接在GLSurfaceView上设置原生的OnGenericMotionListener来处理。

  • 修改步骤:

    1. 在Fragment布局中找到GLSurfaceView实例
    2. 给GLSurfaceView设置旋转事件监听器
    3. 确保GLSurfaceView初始化完成后获取焦点

修改后的代码示例:

@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun StarMap() {
    AndroidViewBinding(StarviewFragmentBinding::inflate, Modifier.focusable()) {
        val myFragment = fragmentContainerView[0]
        // 从Fragment布局中获取GLSurfaceView(假设id为glSurfaceView)
        val glView = myFragment.view?.findViewById<GLSurfaceView>(R.id.glSurfaceView)
        
        glView?.apply {
            setOnGenericMotionListener { _, event ->
                // 判断是否为旋转表冠输入
                if (event.isFromSource(InputDevice.SOURCE_ROTARY_ENCODER)) {
                    // 计算滚动像素,*-1是为了匹配直觉滚动方向
                    val scrollPixels = event.getAxisValue(MotionEvent.AXIS_SCROLL) * -1
                    Log.d("Rotary", "滚动像素值:$scrollPixels")
                    // 在这里添加星图缩放/平移等业务逻辑
                    return@setOnGenericMotionListener true
                }
                false
            }
            // 请求焦点,确保能接收旋转事件
            requestFocus()
        }
        
        Log.d("Map", myFragment.javaClass.name)
        // ... 其他业务逻辑
    }
}
  • 额外注意事项:
    • 确认测试设备支持旋转表冠输入(部分老款Wear设备无此硬件)
    • 如果GLSurfaceView是Fragment动态创建的,建议在Fragment的onViewCreated方法中设置监听器和焦点,避免空指针
    • 滚动方向的正负可根据实际需求调整,无需强制乘以-1

内容的提问来源于stack exchange,提问作者JRowan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:50:32