Evgenii Legotckoi
05 березня 2018 р. 14:13

Android. Java проти Qt QML - Підручник 000. Увімкнути Material Design

При розробці як Java, так і Qt QML потрібно включення Material Design.

Material Design на Java

У випадку з Java, достатньо включити оформлення теми у файлі styles.xml і задати необхідну колірну гаму для програми.

styles.xml

<resources>

    <style name="AppTheme" parent="android:Theme.Material">
        <!-- Main theme colors -->
        <!--   your app branding color for the app bar -->
        <item name="android:colorPrimary">@color/colorPrimary</item>
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
        <!--   theme UI controls like checkboxes and text fields -->
        <item name="android:colorAccent">@color/colorAccent</item>
    </style>

</resources>

colors.xml

Кольори задаються у цьому файлі.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>

Матеріальний дизайн на Qt QML

Для того, щоб використовувати Material Design на Qt QML, необхідно увімкнути використання Qt Quick Controls 2 у профайлі проекту.

QT += quick quickcontrols2

Далі підключаємо клас QQuickStyle у файлі main.cpp, щоб за допомогою статичного методу даного класу включити стиль оформлення Material Design для всієї програми.

#include <QGuiApplication>
#include <QQuickStyle> // Класс для включения стилизации
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQuickStyle::setStyle("Material"); // Включение Material Design

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

Зміна колірного оформлення

Для зміни колірного оформлення стилю використовується конфігураційний файл qtquickcontrols2.conf, який має бути розміщений у корені проекту поряд із профайлом проекту. Можете додати цей файл до ресурсів, щоб простіше було працювати з цим файлом з IDE.

[Material]
Primary=#3F51B5
Accent=#FF4081
Theme=#303F9F
Foreground=#ffff00
Background=#00ffff

Параметри налаштування колірної схеми

У Java присутні наступні параметри налаштування колірної схеми

  • colorPrimary - основний колір, наприклад колір Action Bar
  • colorPrimaryDark - колір рядка стану
  • textColorPrimary - колір тексту для написів поверх елементів з фоном colorPrimary
  • windowBackground - фоновий колір програми
  • navigationBarColor - колір колір навігаційного меню телефону
  • colorAccent - колір елементів, таких як чекбокси і т.д.

Qt QML має лише п'ять колірних налаштувань

  • Primary - основний колір, елементи схожі на Action Bar
  • Accent - колір елементів, таких як чекбокси
  • Theme - колір теми, застосовується як для головного вікна програми як фон, так і для спливаючих меню або інших елементів. Може бути перевизначена також властивостями Foreground та Background
  • Foreground - окреме колірне налаштування теми, може застосовуватися для тексту, перевизначає установки Theme.
  • Background - застосовується визначення фону таких елементів як меню, Navigation Drawer і т.д. перевизначає установки Theme.

Для Theme можна як значення використовувати System, що означатиме використання системних палітри кольорів. Але при цьому можна провести коригування кольору за допомогою Foreground та Background.

Вам це подобається? Поділіться в соціальних мережах!

A
  • 03 липня 2020 р. 03:05

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

Evgenii Legotckoi
  • 03 липня 2020 р. 11:29

Это актуально для изменения цвета. В файле qtquickcontrols2.conf переменная Primary должна влиять на цвет приложения соответственно и цвет ApplicationBar должен поменяться. Но у status bar вроде как нужно запускать код в Java потоке Android приложения.

Вот есть такое решение

QtAndroid::runOnAndroidThread([=]()
{
    QAndroidJniObject window = QtAndroid::androidActivity().callObjectMethod("getWindow", "()Landroid/view/Window;");
    window.callMethod<void>("addFlags", "(I)V", 0x80000000);
    window.callMethod<void>("clearFlags", "(I)V", 0x04000000);
    window.callMethod<void>("setStatusBarColor", "(I)V", 0xffffffff); // Desired statusbar color
});

Для изменения цвета текста

QAndroidJniObject decorView = window.callObjectMethod("getDecorView", "()Landroid/view/View;");
decorView.callMethod<void>("setSystemUiVisibility", "(I)V", 0x00002000);

Есть ещё вот такой репозиторий, который должен с этим работать github . Но насколько он актуален, я не знаю.
Но думаю, что лучше подключите проект из github в своём проекте. Он выглядит достаточно адекватным на беглый взгляд.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up