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
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.
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.
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;
}
}
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
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