MyTetra Share
Делитесь знаниями!
Как добавить сплеш-скрин в QML-приложение под Android
Время создания: 18.08.2018 21:47
Автор: xintrea
Текстовые метки: qt, qt5, qml, splash screen, сплеш-скрин, android, андроид, AndroidManifest.xml
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - QML
Запись: xintrea/mytetra_syncro/master/base/1534618070x5ml2eesa4/text.html на raw.github.com

Первое, что нужно знать: если приложение написано с использованием QML-движка QQmlApplicationEngine, то кроссплатфоменное решение в C++ - коде с классом QSplashScreen работать не будет. Даже для режима компиляции Desktop. Для отображения сплеш-скрина придется пользоваться нативными средствами Android. И виден такой сплеш-скрин будет только на платформе Android.


Далее предполагается, что читатель знает и понимает что такое шаблон настройки Android-приложения, и правит файлы именно в шаблоне.



Вариант быстрый и кривой


В интернете гуляет быстрое решение, которое почти работает. Оно заключается в том, чтобы раскомментировать в файле AndroidManifest.xml строку:


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


Чтобы эта настройка сработала, надо в следующие каталоги разместить файл splash.png нужного разрешения:


/android/res/drawable-hdpi

/android/res/drawable-ldpi

/android/res/drawable-mdpi


В чем проблема такого решения? В том, что картинка будет растягиваться на весь экран. И какими опциями можно сохранить пропорции картинки, в интернетах я не нашел. Такое впечатление, что их просто нет. А каким образом подготавливать картинку на разные соотношения сторон экранов мобильников и планшетов, совершенно непонятно.



Вариант медленный и почти правильный


Этот вариант заключается в том, чтобы в вышеуказанную строку подсунуть не картинку, а целый слой с картинкой. И тогда появляется возможность разместить на этом слое картинку так, как задумывалось. Для этого нужно сделать следующие шаги.



1. Настроечная строка в файле AndroidManifest.xml должна приобрести следующий вид:


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



2. В каталоге /android/res создать подкаталог drawable. В него надо положить файл splash_screen.xml следующего содержания:


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

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

<item>

<shape android:shape="rectangle" >

<!-- Цвет фона ARGB -->

<solid android:color="#FF5090A0"/>

</shape>

</item>

<item>

<!-- Картинка -->

<bitmap android:src="@drawable/splash" android:gravity="center"/>

</item>

</layer-list>



3. Создать файл splash.png в разных разрешениях и разложить его в каталоги:


/android/res/drawable-hdpi

/android/res/drawable-ldpi

/android/res/drawable-mdpi



4. В каталоге /android/res/values создать файл apptheme.xml следующего содержания:


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

<resources>

<style name="AppThemeWithSplashScreen" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">

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

</style>

</resources>



5. В файле AndroiManifest.xml в свойствах тега <activity ... /> нужно добавить атрибут:


android:theme="@style/AppThemeWithSplashScreen"



Вот и все. Теперь при старте программы будет появляться картинка сплеш-скрина, причем с правильными изначальными пропорциями (aspect ratio). Кроме того, в пункте 2 показано, как менять цвет фона для сплеш-скрина.


Есть ли у этого решения проблемы? Да, есть.


Первая проблема в том, что во время загрузки приложения картинка сплеш скрина может "съехать" вниз на некоторое (небольшое) расстояние относительно позиции своего первого появления. Не так чтоб это была большая проблема, но неприятно, что такое примитивное действие как показ сплеш-скрина может глючить. Причем это может происходить только в определенных ориентациях экрана (у меня в портретной), а в другой ориентации этой проблемы может и не быть. Почему так происходит - пока не разобрался.


Вторая проблема - абсолютно бесшовного сплешскрина этим методом не получится сделать. Все равно при загрузке приложения пару раз экран будет мерцать светлыми или темными экранами, на которых ничего нет. Мне это не критично, но если кому-то важно, то можно найти решение вот тут:


Complete Guide to Making a Splash Screen for your QML Android Application


Основная идея там в том, что вначале делается сплеш-скрин Android-ными методами, как описано здесь во втором варианте, а затем плавно показывается QML-сплеш-скрин, который первым загружается через загрузчик Loader. Плавно показывать нужно из-за того, что практически невозможно надежно и точно попасть в размещение картинки, которое делает Android-метод. Поэтому сплеш-скрин средствами QML показывается плавно, чтобы не было резкого скачка изображения.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования