Qt for Android(十) —— APP需要全屏显示,如何获取设备的真实宽高?

957 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

背景:

在做QT for Android 的时候,我们的APP是一个播放类的APP,会有一个全屏显示的需求。在尝试了QT的各种全屏方案之后,发现根本无法做到全屏,要不就是包含了导航栏,要不就是包含了状态栏。因此我们必须另辟蹊径达到全屏效果。

在阅读这篇文章之前,建议先阅读之前的文章,因为本文需要有一定的QT 和 Android 交互基础。

Qt for Android(一) —— QT 中如何调用android方法

Qt for Android(二) —— QT 中调用自定义Android方法详细教程

Qt for Android(三) —— QT 中获取 Android 的Services

QT方法尝试:

在QT中,我们常用的让应用全屏的方法无外乎这几种:

方法一:

QSCreen screen = QGuiApplication::primaryScreen(); 
int screenW = screen->geometry().width(); 
int screenH = screen->geometry().height();

方法一获取到的高度信息,没有包含底部导航栏高度,所以并非设备的真实高度。

方法二:

QDesktopWidget *pDesktopW = QApplication::desktop();
QRect m_screenRect = pDesktopW->screenGeometry();
int screenW = m_screenRect.width(); 
int screenH = m_screenRect.height();

方法二获取到的高度信息,又没有包含顶部状态栏高度,所以也不能满足我们的需求。

另辟蹊径:

在尝尽QT的方法之后,发现并不能获取到完整的真实的设备宽高,因此我们需要采用Android的方法,从Android层获取宽高信息。

 /**
     * 通过反射,获取包含虚拟键的整体屏幕高度
     *
     * @return
     */
      public void getScreenRealHeight() {
        System.out.println("getScreenRealHeight");
        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        @SuppressWarnings("rawtypes")
        Class c;
         try {
            c = Class.forName("android.view.Display");
            @SuppressWarnings("unchecked")
            Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
            method.invoke(display, dm);
            SystemInfo.PHONEWIDTH = dm.widthPixels;
             SystemInfo.PHONEHEIGHT = dm.heightPixels;
            System.out.println("getHasVirtualKey PHONEWIDTH:" + dm.widthPixels);
            System.out.println("getHasVirtualKey PHONEHEIGHT:" + dm.heightPixels);
        } catch (Exception e) {
            System.out.println("getHasVirtualKey Exception:" + e.toString());
            e.printStackTrace();
        }
    }

基于之前的文章,我们需要有一个继承自QtActivity的自定义Activity,然后在自定义的Activity调用上面这个方法即可。然后将获取到的值赋值给自定义的类 SystemInfo 的静态变量,然后使用 Qt for Android(一) —— QT 中如何调用android方法 中的方法在QT中获取这个值即可,完美获取设备的真实宽高。