- 1. main.qml
- 2. AndroidManifest.xml
- 3. splash.xml
- 4. apptheme.xml
- 5. Result
Let me show you a small example of adding Splash Screen to an application written in Qt. In this case, the Splash Screen will be added to the application using the Android ecosystem, that is, through its manifest. Adding a manifest has been described here.
One option for creating a Splash Screen in Qt/QML is to write code in QML/C++, but the disadvantage of this way is that you will see a black screen of the application until the application is fully loaded. Therefore, you must load the application using Java, through its manifest.
Let's make such a splash
The structure of the project will look as follows
main.qml
I'll start with the most boring - this is the content of the QML file of the application, which we will expect to download when the application starts. Nothing remarkable, the usual "Hello World"
import QtQuick 2.12 import QtQuick.Window 2.12 Window { id: window visible: true width: 480 height: 640 title: qsTr("Hello World") Text { text: qsTr("Splash Screen") anchors.centerIn: parent } }
AndroidManifest.xml
And now we’ll fix the manifest in which you need to specify the resource file of the application theme, which will be called apptheme.xml
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:theme="@style/AppTheme" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop">
Next, add information about the splash screen file
<!-- Splash screen --> <meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/> <!-- Splash screen -->
These files must be added to the res/values and res/drawable directories
splash.xml
In the Splash Screen there is an application icon, it is also located in the drawable directory.
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" > <solid android:color="#FFFFFFFF"/> </shape> </item> <item> <bitmap android:src="@drawable/icon" android:gravity="center" /> </item> </layer-list>
apptheme.xml
Here we disable the title bar, and also set the background of the application window.
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="AppTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar"> <item name="android:windowBackground">@drawable/splash</item> </style> </resources>
Result
As a result, this will be enough to get the application with Splash Screen.
Интересен формат иконки, если это png, то как решается проблема scalability? не растягивается ли лого на китайфонах с 1280х2500? У меня просто сплеш скрин с градиентом и логотипом, и вот несколько дней уже пытаюсь реишить проблему растягивания лого, и 9patch делал, и пытался покрыть разрешения, но ещё не пробовал в xml поверх нацепить лого на центр, скажите пожалуйста, решается ли таким образом проблема с совместимостью со всеми экранами?
На данный момент не скажу. Очень давно уже не брался за Java на Android
Ну я решил проблему созданием лого для m-xxxhdpi, разложил по папкам и андроид сам вытаскивает нужный, но, в руководстве один важный аспект пропущен, хотя возможно это у меня только, вообщем qt может свою meta-data всунуть в приложение, и будет либо белый экран после сплеша либо вообще каша, нужно найти в манифесте эту метадату с qtшными splashacreen и splashacreen_port и удалить эти две строки, это я так, вдруг кому пригодится, вроде бы если изначально не пытаться через qtшный гуи манифеста ставить скрины то он ничего не допишет, но вдруг.