[JAVA] Generieren Sie die Datei colours.xml für dunkle Themen mit der Technologie, die Force Dark unterstützt

TD;DL --Android # 2 Dies ist der Artikel am 15. Tag des Adventskalenders.

Einführung

Eine der von Android 10 eingeführten Funktionen ist Force Dark. Das Element Force Dark Override in den Entwickleroptionen erzwingen entspricht dem, und es handelt sich um eine Technologie, die ein dunkles Thema mit relativ hoher Qualität anwendet, wenn eine vorhandene Anwendung mit aktivierter Option gestartet wird. In diesem Artikel verwenden wir die Technologie, die Force Dark unterstützt, um die Datei colours.xml für dunkle Themen aus der vorhandenen color.xml zu generieren.

Technologie, die Force Dark unterstützt

Laborfarbraum

Der Laborfarbraum ist ein Farbraum, der basierend auf dem CIE1931-Farbraum definiert wird und durch die Abmessung L dargestellt wird, die die Helligkeit und die Komplementärfarben a * b angibt. Im Vergleich zu dem uns während der Entwicklung bekannten RGB-Farbraum ist Dimension L ein charakteristischer Parameter, der nahe an der Helligkeit des menschlichen Sehens liegt. [1]

Skia Eine Grafikbibliothek für 2D-Rendering, die in Chrom und Firefox verwendet wurde und von Skia Inc. entwickelt wurde und von Google erworben wurde. Es wurde standardmäßig zum Rendern bis Android 3 Honyecomb verwendet, aber aus Leistungsgründen wurde der Rendervorgang durch Hwui ersetzt, das später beschrieben wird. Skia-definierte Strukturen werden weiterhin zum Rendern verwendet.

Hwui Wahrscheinlich eine Abkürzung für Hardware UI. Eine Grafikbibliothek, die als hardwarebeschleunigte Option in Android 3 Honyecomb hinzugefügt wurde und seit IceCream Sandwitch zum Standard geworden ist. Es wurde eingeführt, um Grafiken auszudrücken, die Skia aufgrund der hohen Auflösung von Android-Geräten und der Nachfrage nach umfangreichen Animationen in Anwendungen nicht ausdrücken kann.

Realisierung von Force Dark auf Android [3]

Unter Android werden die folgenden Schritte ausgeführt, um in ein dunkles Thema zu konvertieren und ein Grafik-Rendering durchzuführen. Da die Erklärung jeder Zeile lang sein wird, wird sie hier weggelassen.

-> 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

Dieser Code ist die Substanz von Force Dark bei der Konvertierung von RGB-Farben für nicht dunkle Themen in RGB-Farben für dunkle Themen. Konvertieren Sie den RGB-Farbraum in den Lab-Farbraum, reduzieren Sie gegebenenfalls die Helligkeit und konvertieren Sie ihn erneut in den RGB-Farbraum.

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

Generieren Sie colours.xml für dunkle Themen

Für Skia ist es gut, weil es relativ einfach ist, eine gemeinsam genutzte Bibliothek zu generieren [2], aber für Hwui ist der Quellcode von Android zu groß und es scheint schwierig zu kompilieren. Extrahieren Sie also nur die relevante Datei und schreiben Sie die Header-Datei neu Dazugehörigen.

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

Der tatsächliche Code ist unten https://github.com/sdsd08013/dark_color_gen

Ergebnis

Das Folgende ist das Ergebnis der Generierung und Erstellung von Farben.xml für das dunkle Thema aus Farben.xml der offiziellen App von droidkaigi2018. Obwohl es so aussieht, scheint der Grad an Perfektion allein damit gering zu sein, und sogar im Vergleich zu Android Force Dark, Force Dark, das Farben für dunkle Themen in Echtzeit erzeugen und rendern kann Das dunkle Thema ist vollständiger.

refs [1] Wiki Lab-Farbraum [2] Skia-Beamter [3]android Git repositories Learning about the Android graphics subsystem

Recommended Posts

Generieren Sie die Datei colours.xml für dunkle Themen mit der Technologie, die Force Dark unterstützt
Planen Sie die Optimierung mit AI, die den Grund für das Ergebnis versteht
Generieren Sie die Datei colours.xml für dunkle Themen mit der Technologie, die Force Dark unterstützt
Planen Sie die Optimierung mit AI, die den Grund für das Ergebnis versteht
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert