Wear OS应用中GLSurfaceView旋转输入无响应问题求助
解决Wear OS中GLSurfaceView旋转表冠事件无响应的问题
核心问题:你当前给Fragment请求焦点,但旋转事件需要GLSurfaceView本身获取焦点;同时Compose的
onRotaryScrollEvent无法穿透到嵌套的原生GLSurfaceView,建议直接在GLSurfaceView上设置原生的OnGenericMotionListener来处理。修改步骤:
- 在Fragment布局中找到GLSurfaceView实例
- 给GLSurfaceView设置旋转事件监听器
- 确保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
相关产品推荐
相关产品推荐

