作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 Android 设备开发一个 cocos2d-x 应用程序。我会有两种不同的屏幕配置,专为移动和平板设备格式设计。在 main.cpp 中,我想添加一些逻辑来确定设备是平板电脑还是移动设备。这样我就可以在应用程序启动时加载适当布局的界面。
我已经看到通过 Java 代码检测平板电脑或设备的解决方案,但是有没有办法在 NDK 的 C++ 中做同样的事情?
最佳答案
要获得屏幕分辨率,您可以使用 ANativeWindow
:
ANativeWindow nativeWindow = ANativeWindow_fromSurface(env, surface);
int width = ANativeWindow_getWidth(renderEngine->nativeWindow);
int height = ANativeWindow_getHeight(renderEngine->nativeWindow);
但这还不够,您还需要 NDK 无法提供的屏幕密度。您可以使用 JNI 获取它。 Java 中的几行最终会是:
JNIEnv* jni;
app->activity->vm->AttachCurrentThread(&jni, NULL);
jclass activityClass = jni->FindClass("android/app/NativeActivity");
JNI_ASSERT(jni, activityClass);
jmethodID getWindowManager = jni->GetMethodID (activityClass, "getWindowManager" , "()Landroid/view/WindowManager;");
JNI_ASSERT(jni, getWindowManager);
jobject wm = jni->CallObjectMethod(app->activity->clazz, getWindowManager);
JNI_ASSERT(jni, wm);
jclass windowManagerClass = jni->FindClass("android/view/WindowManager");
JNI_ASSERT(jni, windowManagerClass);
jmethodID getDefaultDisplay = jni->GetMethodID(windowManagerClass, "getDefaultDisplay" , "()Landroid/view/Display;");
JNI_ASSERT(jni, getDefaultDisplay);
jobject display = jni->CallObjectMethod(wm, getDefaultDisplay);
JNI_ASSERT(jni, display);
jclass displayClass = jni->FindClass("android/view/Display");
JNI_ASSERT(jni, displayClass);
jclass displayMetricsClass = jni->FindClass("android/util/DisplayMetrics");
JNI_ASSERT(jni, displayMetricsClass);
jmethodID displayMetricsConstructor = jni->GetMethodID(displayMetricsClass, "<init>", "()V");
JNI_ASSERT(jni, displayMetricsConstructor);
jobject displayMetrics = jni->NewObject(displayMetricsClass, displayMetricsConstructor);
JNI_ASSERT(jni, displayMetrics);
jmethodID getMetrics = jni->GetMethodID(displayClass, "getMetrics", "(Landroid/util/DisplayMetrics;)V");
JNI_ASSERT(jni, getMetrics);
jni->CallVoidMethod(display, getMetrics, displayMetrics);
JNI_ASSERT(jni, true);
jfieldID xdpi_id = jni->GetFieldID(displayMetricsClass, "xdpi", "F");
JNI_ASSERT(jni, xdpi_id);
float xdpi = jni->GetFloatField( displayMetrics, xdpi_id);
JNI_ASSERT(jni, true);
代码取自 this question . JNI_ASSERT
是一个小型错误检查宏。
获得显示器的分辨率和 dpi 后,计算屏幕尺寸应该很简单。您将必须决定“手机”和“平板电脑”的分界线。 (但您始终可以窥视 Android 的界限!)
关于android - 如何在 Android NDK 中检测手机或平板电脑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18856141/
我是一名优秀的程序员,十分优秀!