힘으로 어둠을 지탱하는 기술, 어둠의 주제용colors.xml 생성

5919 단어 AndroidJavaC++

TD;DL

  • Android#2 광고 달력의 15일째 글입니다
  • 다음 저장소 스크립트를 실행하면 생성됩니다.
    https://github.com/sdsd08013/dark_color_gen
  • layout의 색 지정 방법은 매우 강하게 의존하기 때문에 기본적으로 이것만으로는 어두운 주제의 대응을 해결할 수 없다
  • 입문


    Android10에서 가져온 기능에는 "암흑"이 있습니다.개발자를 위한 옵션 중의 어두운 덮어쓰기 항목은 이 옵션을 ON으로 설정한 상태에서 기존 응용 프로그램을 시작하면 비교적 높은 품질로 어두운 테마를 응용하는 기술이다.이 글에서 힘의 어둠을 지탱하는 기술을 이용하여 기존의 컬러스.xml에서 어두운 테마까지colors.xml을 생성합니다.

    어둠의 힘을 지탱하는 기술


    컬러 공간


    Lab 색상 공간은 CIE1931 색상 공간을 기반으로 정의된 색상 공간에서 밝기를 나타내는 비트L과 보색 a*b로 표시됩니다.개발할 때 사용하는 익숙한 RGB 색 공간에 비해 차원 L은 특징적인 매개 변수로 인간의 시각적 밝기에 가까운 디자인이다.

    [1]

    Skia


    구글이 인수한 Skia inc가 개발한 크롬과 파이어폭스도 실적이 있는 2D 렌더링을 목적으로 한 그래픽 라이브러리다.
    Android3Honyecomb까지 렌더링은 기본적으로 사용되지만, 성능상의 이유로 렌더링 처리는 후술한 Hwui로 대체됩니다.렌더링에 사용되는 구조체 등은 Skia 정의 구조체를 계속 사용합니다.

    Hwui


    아마도 HardwareUI의 줄임말일 것이다.
    Android3Honyecomb에 하드웨어 가속 옵션으로 추가된 IceCream Sandwitch 이후 기본 그래픽 라이브러리입니다.Android 터미널이 고해상도로 바뀌고 응용 프로그램이 풍부한 애니메이션을 요구하는 등 배경에서 Skia가 표현할 수 없는 도형을 표현하기 위해 가져옵니다.

    Android에서 어둠의 힘을 실현하기 [3]


    Android에서 다음 절차에 따라 어두운 테마로 변환하여 그래픽 렌더링을 합니다. 각 줄의 설명이 길어지기 때문에 생략합니다.

    -> updateForceDarkMode


    -> setForceDark


    -> applyColorTransform


    -> transformColor


    -> makeDark


    어두운 주제가 아닌 RGB 색상을 어두운 주제 RGB 색상으로 변환하는 프로세스에서 어두운 힘의 실체는 이 코드입니다.
    RGB 색상 공간을 Lab 색상 공간으로 변경해야 하는 경우 밝기를 줄이고 다시 RGB 색상 공간으로 변경합니다.
    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;
        }
    }
    

    어두운 테마colors.xml 생성


    Skia에 관해서는 비교적 간단하게 공유 라이브러리[2]를 생성할 수 있기 때문에 좋지만 Hwui,android에 관한 원본 코드가 너무 커서 컴파일하기도 어려워서 해당하는 파일만 추출하고 제목 파일을 다시 씁니다.
    macOS Mojava
    バージョン 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
    
    실제 코드는 다음과 같다.
    https://github.com/sdsd08013/dark_color_gen

    결과


    다음은droidkaigi 2018의 공식 응용 프로그램colors입니다.xml에서 어두운 테마까지colors.이것은 xml을 생성하고 구축한 결과입니다.그런 색깔이 있을 수 있지만 그것만으로도 완성도가 낮다는 인상을 준다. 실제 안드로이드의 원력 어둠에 비해 실시간으로 어둠 테마용 색깔을 생성하고 렌더링하는 원력 어둠 테마의 완성도가 높다.

    refs


    [1]wiki Lab 색상 공간
    [2]skia 공식
    [3]android Git repositories
    Learning about the Android graphics subsystem

    좋은 웹페이지 즐겨찾기