Qt 5.9 for Android 实现沉浸式状态栏

  Android 手机应用程序如果不全屏,系统默认的顶部状态栏的颜色(黑色)会破坏精心设计的 APP 的整体风格和美感,所以,对状态栏的处理,个人觉得还是很有必要的。

  在 Qt 5.9 中,使用 QML声明式语言, 通过 Screen 对象来获取到设备的长宽,可以分别获取到整个设备的长宽和去掉手机顶部状态栏之后的长宽,可以说非常方便吧,但是,当你设置整个 Windows 对象或者ApplicationWindow 对象的长宽为设备的最大长宽的时候,会发现并不能生效,状态栏屹立不倒,忘了说了,这个沉浸式状态栏只有在 Android 4.4 及以上版本才会有效,4.4 以下的根本不支持,所以各位要注意自己的调试设备的系统版本。

  我在做这个的时候,在网上搜索了很多博客,有一部分说的是利用 Screen 获取长宽后全屏,然后,上方放置一个透明的矩形之类的,这个方法在 Qt 5.9 下面没能成功,因为根本都无法全屏,再者,全屏了之后,状态栏是会被影藏的,就算你设置了透明也看不到了吧,这个方式 Pass !

  第二种是通过 AndroidManifest.xml 设置 style ,先在 android/res 文件夹下添加 style 文件,然后在 AndroidManifest.xml 引用,style 文件里面设置

  android:windowTranslucentStatus 属性为 true,再设置 

  android:fitsSystemWindows 属性为 true, 然后就就就就就就就就行了,因为这个已经是在利用 Android 系统本身的东西来设置了,几乎脱离了 Qt,感觉还是很靠谱的,但是,我还是失败了。难受...

  以上两种方式,有兴趣的朋友可以自己先试试看,也许是我的打开方式不对呢,万一你就成功了呢!

  最后呢,我想到了 JNI ,Android 系统是由 Java 实现的,我直接通过 Java 代码来实现这个东西,理论上是绝对可行的啊,所以,我建立了 Androidmanifest.xml 之后,添加了我自己编写的 Java 文件,在文件中,重载了 Android 系统程序的入口函数 onCreate()代码如下

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    getWindow().getDecorView().setFitsSystemWindows(true);

  }

其实什么都没有,就是几句话的事,然后程序就自动全屏了,状态栏也透明了,效果如下图:

  这种方式是我在 Android 开发者博客上偷来的,感觉都是 Andoid 开发,都差不多,问我为什么? 母鸡~~~这个方式我想想其实和设置 style 是一样的道理,至于为什么我设置 style 失败,不清楚,诸位可以自己试试,如果成功,就可以不用添加 Java 文件了,挺好的....

  还有个问题就是在全屏以后,Qt 就无法获取到状态栏的高度了,因为全屏了,然后标题的位置就不好居中了,这是个问题!

  最后,这个东西其实不叫沉浸式状态栏,沉浸式其实是那种全屏游戏的那种,整个屏幕都是窗口的那种,这个叫法都是因为人云亦云,官方没有给出确切的名称,开发者就随便取的名字,不过,不重要了,鸡蛋好吃,没必要知道母鸡的名字,更没必要知道这个蛋排行老几~~~

  对这个东西还有问题的老铁,可以留言,我看到会及时回复,就这样,Bye~~~



posted @ 2017-07-06 11:57  Mtr1994  阅读(3606)  评论(0编辑  收藏  举报