如何在Pixel 6a模拟器上通过NDK注册屏幕旋转事件?
如何在Pixel 6a模拟器上通过NDK注册屏幕旋转事件?
嘿,我来帮你搞定这个屏幕旋转事件检测的问题!从你贴的代码片段来看,你已经在使用android_app的命令处理函数handle_cmd了,其实屏幕旋转相关的触发逻辑就藏在这个回调里,只是你可能漏了对应的命令类型~
在NDK的android_native_app_glue框架中,当屏幕发生旋转(或者系统配置有其他变更)时,会触发APP_CMD_CONFIG_CHANGED这个命令。你只需要在handle_cmd的switch分支里加上这个case,就能捕获到旋转事件了。
我把你的代码补全并加上旋转处理的逻辑,你可以参考:
void handle_cmd(android_app *pApp, int32_t cmd) { aout << "Got Command " << cmd << std::endl; switch (cmd) { case APP_CMD_INIT_WINDOW: // 窗口初始化时创建Renderer实例 pApp->userData = new Renderer(pApp); break; case APP_CMD_TERM_WINDOW: // 窗口销毁时清理资源,避免内存泄漏 if (pApp->userData != nullptr) { delete static_cast<Renderer*>(pApp->userData); pApp->userData = nullptr; } break; case APP_CMD_CONFIG_CHANGED: // 这里就是屏幕旋转(或其他系统配置变更)的触发点 aout << "屏幕旋转啦!或者系统配置有其他变更~" << std::endl; // 如果需要获取旋转后的新屏幕尺寸,可以这么做 if (pApp->window != nullptr) { int32_t newWidth = ANativeWindow_getWidth(pApp->window); int32_t newHeight = ANativeWindow_getHeight(pApp->window); aout << "新的屏幕尺寸:宽" << newWidth << ",高" << newHeight << std::endl; // 通知你的Renderer类更新尺寸,比如调整渲染视口 if (pApp->userData != nullptr) { static_cast<Renderer*>(pApp->userData)->onScreenSizeChanged(newWidth, newHeight); } } // 如果你只想精准处理屏幕旋转,还可以判断当前的屏幕方向 #include <android/configuration.h> AConfiguration* config = AConfiguration_new(); AConfiguration_fromAssetManager(config, pApp->activity->assetManager); int orientation = AConfiguration_getOrientation(config); if (orientation == ACONFIGURATION_ORIENTATION_LANDSCAPE) { aout << "现在是横屏模式" << std::endl; } else if (orientation == ACONFIGURATION_ORIENTATION_PORTRAIT) { aout << "现在是竖屏模式" << std::endl; } AConfiguration_delete(config); break; default: // 其他命令可以按需处理 break; } }
另外给你几个测试和使用的小提示:
- 记得在你的
Renderer类里实现onScreenSizeChanged方法,用来处理尺寸变化后的渲染逻辑,比如重新设置OpenGL的视口、调整资源布局之类的。 - 在Pixel 6a模拟器上测试时,要先开启自动旋转(模拟器设置→显示→自动旋转屏幕),或者用快捷键
Ctrl+F11/F12手动触发旋转,这样才能触发事件。 - 注意
APP_CMD_CONFIG_CHANGED不仅会在旋转时触发,语言切换、字体大小修改等配置变更也会触发,所以如果只需要处理旋转,一定要加上方向判断哦。
备注:内容来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

