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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 07:48:01