[JAVA] Générez des couleurs.xml pour les thèmes sombres avec la technologie qui prend en charge Force Dark

TD;DL --Android # 2 Ceci est l'article sur le 15e jour du calendrier de l'Avent. --Il peut être généré en exécutant le script dans le référentiel suivant. https://github.com/sdsd08013/dark_color_gen

introduction

L'une des fonctionnalités introduites à partir d'Android 10 est Force Dark. L'élément appelé Force Dark Override dans les options du développeur correspond à cela, et c'est une technologie qui applique un thème sombre avec une qualité relativement élevée lorsqu'une application existante est démarrée avec cette option activée. Dans cet article, nous utiliserons la technologie qui prend en charge Force Dark pour générer colors.xml pour les thèmes sombres à partir de colors.xml existants.

Technologie prenant en charge Force Dark

Espace colorimétrique de laboratoire

L'espace colorimétrique Lab est un espace colorimétrique défini sur la base de l'espace colorimétrique CIE1931 et est représenté par la dimension L indiquant la luminosité et les couleurs complémentaires a * b. Par rapport à l'espace colorimétrique RVB qui nous est familier lors du développement, la dimension L est un paramètre caractéristique, conçu pour être proche de la luminosité de la vision humaine. [1]

Skia Une bibliothèque graphique pour le rendu 2D qui a été utilisée dans Chrome et Firefox, qui a été développée par Skia inc acquise par Google. Il était utilisé par défaut pour le rendu jusqu'à Android 3 Honyecomb, mais pour des raisons de performances, le processus de rendu a été remplacé par Hwui, qui sera décrit plus loin. Les structures définies par Skia sont toujours utilisées pour le rendu.

Hwui Probablement une abréviation pour Hardware UI. Une bibliothèque graphique ajoutée en tant qu'option accélérée par le matériel dans Android 3 Honyecomb et est devenue la bibliothèque par défaut depuis IceCream Sandwitch. Il a été introduit pour exprimer des graphiques qui ne peuvent pas être exprimés par Skia en raison de la haute résolution des appareils Android et de la demande d'une animation riche dans les applications.

Réalisation de Force Dark sur Android [3]

Sur Android, les étapes suivantes sont effectuées pour convertir en un thème sombre et effectuer un rendu graphique. Comme il sera long d'expliquer chaque ligne, il sera omis ici.

-> updateForceDarkMode

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewRootImpl.java#4449

-> setForceDark https://android.googlesource.com/platform/frameworks/base/+/master/graphics/java/android/graphics/HardwareRenderer.java#512

-> applyColorTransform https://android.googlesource.com/platform/frameworks/base/+/master/libs/hwui/CanvasTransform.cpp#68

-> transformColor https://android.googlesource.com/platform/frameworks/base/+/master/libs/hwui/CanvasTransform.cpp#57

-> makeDark https://android.googlesource.com/platform/frameworks/base/+/master/libs/hwui/CanvasTransform.cpp#46

Ce code est la substance de Force Dark dans le processus de conversion de la couleur RVB du thème non sombre en couleur RVB du thème sombre. Convertissez l'espace colorimétrique RVB en espace colorimétrique Lab, réduisez la luminosité si nécessaire et convertissez à nouveau l'espace colorimétrique RVB.

static SkColor makeDark(SkColor color) {
    Lab lab = sRGBToLab(color);
    float invertedL = std::min(110 - lab.L, 100.0f);
    if (invertedL < lab.L) {
        lab.L = invertedL;
        return LabToSRGB(lab, SkColorGetA(color));
    } else {
        return color;
    }
}

Générer des couleurs.xml pour les thèmes sombres

Pour Skia, c'est bien car il est relativement facile de générer une bibliothèque partagée [2], mais pour Hwui, le code source d'Android est trop volumineux et il semble difficile à compiler, alors extrayez uniquement le fichier pertinent et réécrivez le fichier d'en-tête Correspondant.

macOS Mojava
Version 10.14.3
clang++ --std=c++14 \
    -I ~/skia/include/core \
    -I ~/skia/include/config \
    -I ~/skia/include/utils \
    -I ~/skia/include/gpu \
    -I ~/skia \
    -I transform.h \
    -I Color.h \
    -I ColorSpace.h \
    -L ~/skia/out/Static \
    -lskia -lz transform.cpp Color.cpp ColorSpace.cpp main.cpp

Le code réel est ci-dessous https://github.com/sdsd08013/dark_color_gen

résultat

Ce qui suit est le résultat de la génération et de la construction de colors.xml pour le thème sombre à partir de colors.xml de l'application officielle de droidkaigi2018. Bien que cela ressemble à ça, il semble que le degré de perfection soit faible avec cela seul, et même par rapport à l'Android Force Dark, Force Dark qui peut générer et rendre des couleurs pour des thèmes sombres en temps réel Le thème sombre est plus complet.

refs [1] espace colorimétrique du wiki Lab [2] skia officiel [3]android Git repositories Learning about the Android graphics subsystem

Recommended Posts

Générez des couleurs.xml pour les thèmes sombres avec la technologie qui prend en charge Force Dark
Planifiez l'optimisation avec une IA qui comprend la raison du résultat
Générez des couleurs.xml pour les thèmes sombres avec la technologie qui prend en charge Force Dark
Planifiez l'optimisation avec une IA qui comprend la raison du résultat
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment