您现在的位置是:网站首页> C/C++

Qt for Android程序沉浸式启动页面

  • C/C++
  • 2021-04-11
  • 1007人已阅读
摘要

最近研究Qml程序在安卓手机上运行,Qml的运行没啥问题,编译环境配置成功即可运行,安卓原生的一些东西就需要自己去琢磨了,比如程序启动后,默认会有一个短暂的黑屏以及默认标题栏,很影响用户体验,通过查阅相关资料后,记录下踩坑之路,先上最终效果(此方法运行环境为Qt 5.11,高级版本方法看下方):

1.png



首先,解决启动黑屏和无标题栏显示,我们需要创建一个 android 的布局文件 xml,在res/drawable目录下创建一个 xml 文件,并命名为style.xml。


<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="custom_Style" parent="android:Theme">

<!--        <item name="android:windowIsTranslucent">true</item>-->

        <item name="android:windowBackground">@drawable/m_splash</item>

        <item name="android:windowNoTitle">true</item>

        <item name="android:windowFullscreen">true</item>

    </style>

</resources>

注意:很多教程上会采用上文中注释掉的<item name="android:windowIsTranslucent">true</item>的方式设置窗口透明的方式实现隐藏黑屏,如果采用该方法,当程序从后台却换到前台时,会没有过渡动画,习惯后台切换的时候就会感觉程序切换的很突兀,因此使用设置启动背景图片,该图片我和程序加载Splash启动页使用同一个,因此可以做到无缝对接。


然后,打开 AndroidMenifest.xml文件,在 Activity 组添加主题的设置:


android:theme="@style/custom_Style"

接下来设置自定义启动页面我们需要创建一个 android 的布局文件 xml,在res/drawable目录下创建一个 xml 文件,并命名为m_splash.xml。

然后,打开该文件,并输入:


<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/colorStart"/>

    <item>

        <bitmap

            android:gravity="center"

            android:src="@drawable/start"/>

    </item>

</layer-list>

注意:自定义一个背景颜色,该颜色与背景图片背景颜色一致,同时该背景图片尺寸不要太大,否则会出现超出屏幕的情况,经本人测试,使用一个一个较小尺寸的图片,设置背景颜色与图片背景一致以达到适配不同尺寸屏幕手机的启动页面效果(CSDN的APP就是这么干的)。


color.xml:(自带模板里有这个文件,在后面加上背景颜色即可)


<?xml version="1.0" encoding="utf-8"?>

<resources>

    <color name="purple_200">#FFBB86FC</color>

    <color name="purple_500">#FF6200EE</color>

    <color name="purple_700">#FF3700B3</color>

    <color name="teal_200">#FF03DAC5</color>

    <color name="teal_700">#FF018786</color>

    <color name="black">#FF000000</color>

    <color name="white">#FFFFFFFF</color>

    <color name="colorStart">#f7f8fb</color>

</resources>

在AndroidMenifest.xml中,设置启动页面,原始状态下该属性为注释状态,一个属性表示启动页路径,第二个属性值表示启动页是否保持住,为false时为一闪而过:


<!-- Splash screen -->

<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/m_splash"/>

<meta-data android:name="android.app.splash_screen_sticky" android:value="true"/>

<!-- Splash screen -->

基本功能都添加完毕了,现在的程序APP就像那么回事了,最后设置启动页自动关闭时间,在main.cpp中设置单次计时器:


#ifdef Q_OS_ANDROID

QTimer::singleShot(3000,&app,[=](){QtAndroid::hideSplashScreen(500);});

#endif

基本功能就讲解完了,如果要像我这么要求启动页是沉浸式标题栏(白色),进入主界面时候标题栏变成程序主题色(蓝色),在Qml中添加修改状态栏颜色代码,当计时器时间到后,QtAndroid::hideSplashScreen启动后,调用Qml中修改状态栏颜色的函数即可。


    QObject* obj = engine.rootObjects()[0];

    #ifdef Q_OS_ANDROID

    QTimer::singleShot(3000,&app,[=](){QtAndroid::hideSplashScreen(500);QMetaObject::invokeMethod(obj,"setStatusBarColor");});

    #endif

我设置状态的方法使用 GitHub中一个大神做的一份开源代码,专门处理透明状态栏的,并且使用非常方便,跟着说明添加进工程就可以,链接地址:


https://github.com/jpnurmi/qtstatusbar


最后贴张资源文件图:

1.png



Tips:当在做Qt网上查不到资料时,可以试试直接搜Android 


Qt 5.15添加启动页面

更新Qt版本后,直接提供了启动页面窗口,很方便,如图:

1.png


解决启动黑屏和无标题栏显示,我们需要创建一个 android 的布局文件 xml,在res/drawable目录下创建一个 xml 文件,并命名为style.xml,内容稍有不同,既把启动页面行删掉即可:


<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="custom_Style" parent="android:Theme">

<!--        <item name="android:windowIsTranslucent">true</item>-->

<!--        <item name="android:windowBackground">@drawable/m_splash</item>-->

        <item name="android:windowNoTitle">true</item>

        <item name="android:windowFullscreen">true</item>

    </style>

</resources>

注意:用到的文件需要添加到pro中,没用到的文件不要放资源文件中)



Top