Russian Qt Forum

Qt => Qt Quick => Тема начата: navrocky от Декабрь 16, 2015, 23:06



Название: Отображение splash картинки во время загрузки приложения на Android
Отправлено: navrocky от Декабрь 16, 2015, 23:06
Делаю приложение на Quick, при загрузке на андроиде, сперва видно нативную активити секунду, потом черный экран несколько секунд, и только потом всё стартует. Хотелось бы спрятать всё это безобразие за splash экраном.

Кто-нибудь эту проблему решил как нибудь?

Чую, что надо наследовать кутэшную активити на жабке и отображать на ней сплеш, до тех пор, когда Quick не будет готов. Но инфы/примеров пока не нашел как добраться до этой активити и как от нее отнаследоваться  :-\


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: Alex Custov от Декабрь 16, 2015, 23:18
ну так добавь сплаш в манифест, в чём проблема?


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: navrocky от Декабрь 18, 2015, 10:32
Ок, допустим я создам файл новой активити, отнаследуюсь от стандартной кутэшной, файл судя по build.gradle надо положить в папку: android/src ?

Код:
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']

Далее я думаю разместить каким-то образом компонент картинку поверх opengl view, на который выводится qtquick. И уже после того как заработает код qtquick прятать эту картинку. Видать надо как-то через JNI настроить проброс сигнала в JAVA-код..

Правильно я мыслю или можно как-то проще?

ЗЫЖ Какого чёрта это не сделано в самом Qt? Вроде бы нужная функция с учётом того как тормозно загружается QtQuick на Android.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: Alex Custov от Декабрь 18, 2015, 10:41
Ок, допустим я создам файл новой активити, отнаследуюсь от стандартной кутэшной, файл судя по build.gradle надо положить в папку: android/src ?

Ещё раз - почему ты не хочешь использовать сплаш через свой манифест? Всё что тебе потребуется это поменять манифест, и добавить картинки для сплашей под разные dpi. Не нужно при этом менять активити.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: navrocky от Декабрь 18, 2015, 10:53
Я слегка погуглил и нагуглил, что в андроиде нет сплеша как такового и решается всё это через дополнительное активити.

Второе, QtQuick грузится во время старта стандартного кутэшного активити. Соответственно, если я буду показывать свой сплэш в отдельном активити, то в это время QtQuick грузиться не будет, а начнёт только когда дело дойдет до кутэшного активити. В общем эффект черного экрана никуда не пропадёт. Так?

Я далёк от разработки под андроид, наверное, поэтому мои вопросы странные  ;D


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: Alex Custov от Декабрь 18, 2015, 10:58
Я слегка погуглил и нагуглил, что в андроиде нет сплеша как такового

Где ты такое нагуглил? В AndroidManifest.xml внутрь активити прописывается сплаш:
Код
XML
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>

Я не помню насколько хорошо он работает, ЕМНИП чёрный экран всё ранво был на долю секунды. Не знаю как на последней версии Qt.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: navrocky от Декабрь 18, 2015, 11:02
Я слегка погуглил и нагуглил, что в андроиде нет сплеша как такового

Где ты такое нагуглил? В AndroidManifest.xml внутрь активити прописывается сплаш:
Код
XML
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>

Я не помню насколько хорошо он работает, ЕМНИП чёрный экран всё ранво был на долю секунды. Не знаю как на последней версии Qt.

Надо попробовать, как доберусь. Хотя есть сомнение, что андроидовский сплеш уберется как только стартанёт активити, и оно потом будет прогружать QtQuick с черным экраном.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: navrocky от Декабрь 19, 2015, 02:19
Получилось со сплэшем. Спасибо за наводку.

Опишу подробно как сделать сплэш.

1) Если в проекте еще не создан шаблон для сборки под android, то надо зайти в свойства проекта и нажать кнопку Android->Run->Build Android APK->Android->Create Templates. При этом будет создана папка android в корне исходников с файлами для сборки APK.

2) Создать splash картинки (logo.png) нескольких размеров и положить их в соответствующие папки:
Код:
android/res/drawable-mdpi/logo.png
android/res/drawable-hdpi/logo.png
android/res/drawable-xhdpi/logo.png

  • xlarge (xhdpi): 640x960
  • large (hdpi): 480x800
  • medium (mdpi): 320x480

Возможно можно обойтись одной картинкой, под остальные размеры она смаштабируется. Решать вам.

3) В AndroidManifest.xml раскомментировать <meta-data android:name="android.app.splash_screen_drawable" ...

Код:
<!-- Splash screen -->
<!--
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/>
-->
<!-- Splash screen -->

4) Также можно скрыть ActionBar появляющийся при старте activity (такая полоска сверху с заголовком приложения)

Для этого надо дописать в тэг activity атрибут android:theme="@android:style/Theme.NoTitleBar" примерно так:

Код:
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="Audio Tales" android:screenOrientation="unspecified" android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar">

В итоге мы получим следующее:

Приложение стартует и мы видим некоторое непродолжительное время черный экран, затем появляется наш splash. В это время прогружается QML/Quick. Затем долю секунды мигает черным и уже нормально запускается наше приложение.

24.07.2016 UPD:

Нашел неплохой мануальчик какого-то китайца: https://medium.com/@benlaud/complete-guide-to-make-a-splash-screen-for-your-qml-android-application-567ca3bc70af#.21z1enmvu (https://medium.com/@benlaud/complete-guide-to-make-a-splash-screen-for-your-qml-android-application-567ca3bc70af#.21z1enmvu)


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kibsoft от Январь 21, 2017, 18:15
Вчера заморочился по поводу этого черного мерцания на долю секунды и был найден workaround. Подробно описал здесь: https://bugreports.qt.io/browse/QTBUG-43558
Теперь все работает отлично, как и у нативных приложений, без всяких мерцаний.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: docent от Февраль 17, 2017, 11:14
Подскажите пожалуйста, есть ли подобное решения для iOS?


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kambala от Февраль 17, 2017, 13:49
а там сложности с этим? все разжевано например тут http://stackoverflow.com/questions/18976412/launch-screens-supporting-ios6-and-ios7-forced-to-splash-screen


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kibsoft от Февраль 20, 2017, 18:51
kambala, я полагаю, что docent имел в виду проблему с мерцанием черного экрана между splash и запуском Qt приложения. Как я написал выше, в Android я смог найти вариант решения проблемы, а iOS пока особо не занимался, но пробовал запускать приложение. Там тоже заметил этот мелькающий черный экран. С iOS опыта не имею, так что если кто знает  как убрать это мерцание, тоже послушаю  :)


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kambala от Февраль 20, 2017, 19:14
как вариант, можно просто отображать загрузочную картинку руками как только запустилось приложение. для этого надо или использовать свой класс, реализующий протокол UIApplicationDelegate, либо подписаться на UIApplicationDidFinishLaunchingNotification. могу попробовать сделать тестовый проект с этой реализацией.

как решить это без использования objc/swift кода не знаю, с Qt на iOS пока не работал.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kibsoft от Февраль 20, 2017, 21:19
На Android тоже пытались таким образом избежать мерцания, но там проблема была в SurfaceView, который по какой-то непонятной причине сначала показывал черный экран вместо приложения. Т.е. даже если у себя в Qt-приложении сделать идентичный Splash, то в нем нет смысла, т.к. сам SurfaceView мерцает при старте. Видимо в iOS похожая проблема.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kambala от Февраль 21, 2017, 03:05
создал Qt Quick Controls 2 Application в свежем креаторе, запустил на девайсе — никакого мерцания нет. ЧЯДНТ? Qt 5.8.0 (самосборная), Xcode 8.2.1, девайс с iOS 10.2.


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: eg015t от Март 23, 2017, 14:47
Вчера заморочился по поводу этого черного мерцания на долю секунды и был найден workaround. Подробно описал здесь: https://bugreports.qt.io/browse/QTBUG-43558
Теперь все работает отлично, как и у нативных приложений, без всяких мерцаний.
kibsoft, а не покажите поконкретней, что делать надо. По ссылке выше - не совсем понятно, там упоминание про загрузку сырцов qt, но шагов по реализации решения не нашел здесь... http://stackoverflow.com/questions/8772862/surfaceview-flashes-black-on-load


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kibsoft от Март 24, 2017, 22:44
Вот ссылка на мой комментарий, где я пошагово описал, что нужно сделать - https://bugreports.qt.io/browse/QTBUG-43558?focusedCommentId=344174&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-344174. Там в исходниках надо кое-что подправить, пересобрать jar-пакеты и скопировать их обратно в каталог с текущей Qt. Исходники можно загрузить через онлайн-инсталлятор (если вы через него ставили Qt).
P.S. Я все это делал на Linux


Название: Re: Отображение splash картинки во время загрузки приложения на Android
Отправлено: kuzulis от Сентябрь 22, 2018, 17:43
Народ, а как указать разные сплеш картинки для разной ориентации экрана?

Отвечу сам себе, кажется работает если добавить кучу директорий, типа:

...
drawable-land-ldpi/splash.png
drawable-land-mdpi/splash.png
drawable-land-hdpi/splash.png
...
drawable-port-ldpi/splash.png
drawable-port-mdpi/splash.png
drawable-port-hdpi/splash.png
...