这是我参与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中获取这个值即可,完美获取设备的真实宽高。