targetSdkVersion28+Android9.0부터 WebView에서 RGBA의 컬러 코드를 쓸 수 있습니다

13129 단어 Android
2019년 8월Google Play에서 새 앱을 출시할 때 targetSdkVersion이 28 이상이어야 합니다.이 시작되었기 때문이다.기존 응용 프로그램의 업데이트도 11월부터 같은 조치를 취하기 때문에 대책을 세울 때가 많지 않다.
따라서 API Level28에 새로 추가된 내용이 무엇인지 확인했습니다.
  • 비헤이비어 변경: API 레벨 28+를 대상으로 하는 애플리케이션
  • 프론트 데스크톱 서비스는 권한이 필요합니다. 아파치 HTTP 클라이언트의 지원이 정식으로 끝났고 기존의 실현에 따라 있을 수 있는 것들도 볼 수 있습니다.

    WebView에서 색상 코드 변경 판정


    읽다가 갑자기 보이는 것은 "CSS RGBA 16진수 값 처리"항목입니다.
    Android9 이후를 목표로 하는 응용 프로그램에서 4비트와 8비트의 16진법 CSS 색을 처리하기 위해서는 초안CSS Color Module Level 4에서 작성한 동작을 유효하게 해야 합니다.
    CSS Color Module Level 4는 Chrome 52에서 지원되지만 현재 WebView 에서는 사용할 수 없습니다.기존 Android 응용 프로그램이 Android 바이트 순서(ARGB)에 32비트의 16진수 색상을 포함하고 있기 때문에 렌더링 오류가 발생할 수 있습니다.
    예를 들어, 현재 대상 애플리케이션의 API 레벨이 27 이상인 경우 WebView 의 색상 #80ff8080 은 불투명한 연한 빨간색 #ff8080 으로 렌더링됩니다.현재 첫 번째 구성 요소를 무시합니다 (Android에서 알파 구성 요소로 인식됨).한편, API 레벨 28 이후를 목표로 하는 응용 프로그램의 경우 #80ff8080 투명도가 50%인 연두색#80ff80으로 간주됩니다.
    CSS Color Module Level 3까지 4비트에서 8비트로 색 코드를 표시하고 α값을 지정하는 방법은 없습니다.Level4에서도 이러한 RGBA 태그를 지원합니다.
    Android9 이후를 목표로 하는 응용 프로그램에서 4비트와 8비트의 16진법 CSS 색을 처리하기 위해서는 초안CSS Color Module Level 4에서 작성한 동작을 유효하게 해야 합니다.
    위에서 말한 바와 같이 Android 9.0의 WebView에서 CSS Color Module Level4의 행동은 색 코드를 나타낼 수 있을 것 같다.
    그렇다면 그저 그렇다면 이야기는 간단하지만 뒤에 엉망진창으로 쓰여 있는 내용이 마음에 든다.

    Android의 색상 코드는 ARGB로 판정되었습니다.


    Android는 색상 코드를 사용하여 색상을 지정할 수 있지만 α값이 포함된 경우 ARGB(#aarrggbb)로 표시됩니다.#80ff8080 코드로 텍스트를 음영처리하면 투명도 50% textView.setTextColor(Color.parseColor("#80ff8080")) 로 음영처리됩니다.
    이 부근의 행동은 얄밉다. 아마도 안드로이드 크롬의 Level4와 충돌한 것 같다. API Level27 이전의 RGBA 대응은 무효화되었다.
    CSS Color Module Level 4는 Chrome 52에서 지원되지만 현재 WebView 에서는 사용할 수 없습니다.기존 Android 응용 프로그램이 Android 바이트 순서(ARGB)에 32비트의 16진수 색상을 포함하고 있기 때문에 렌더링 오류가 발생할 수 있습니다.
    예를 들어, 현재 대상 애플리케이션의 API 레벨이 27 이상인 경우 WebView 의 색상 #ff8080 은 불투명한 연한 빨간색 #80ff8080 으로 렌더링됩니다.현재 첫 번째 구성 요소를 무시합니다 (Android에서 알파 구성 요소로 인식됨).
    앞의 알파값이 무시되면 좀 이상하지만 알파값이 부착된 색깔 코드는 무의식적인 행동을 가져와 무시 방침이 되었다.

    웹 표준에 맞는 컬러 코드 사용


    API Level28에서 Chrome 간의 협상이 끝난 것 같습니다. WebView에서 Level4 표준 컬러 코드를 사용할 수 있습니다.
    한편, API 레벨 28 이후를 목표로 하는 응용 프로그램의 경우 #ff8080 투명도가 50%인 연두색#80ff8080으로 간주됩니다.
    정말 기쁘고 축하합니다.

    검증


    예를 들어, 현재 대상 애플리케이션의 API 레벨이 27 이상인 경우 WebView 의 색상 #80ff80 은 불투명한 연한 빨간색 #80ff8080 으로 렌더링됩니다.현재 첫 번째 구성 요소를 무시합니다 (Android에서 알파 구성 요소로 인식됨).
    나는 상술한 행위가 실제로 발생할지 의심스러워서 실제로 이동했다.
    targetSdkVersion은 각각 27개와 28개의 앱 모듈을 제작하여 다음 화면을 설정하여 TextView의 행위와 WebView의 행위를 비교할 수 있습니다.
    MainActivity.kt
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val webView = findViewById<WebView>(R.id.webview)
            val html = """
                <html>
                    <body>
                        <span style="color: #80ff8080;"><b>#80ff8080</b></span>
                    </body>
                </html>
            """.trimIndent()
            webView.loadData(html, "text/html", "utf-8")
        }
    }
    
    activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="16dp"
            tools:context=".MainActivity">
    
        <TextView
                android:text="API28 or 27"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" android:id="@+id/textView"
                android:textAppearance="@style/TextAppearance.AppCompat.Display1"/>
    
        <TextView
                android:text="TextView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" android:id="@+id/textView1"
                android:textAppearance="@style/TextAppearance.AppCompat.Headline"/>
    
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="#80ff8080"
                android:textColor="#80ff8080"
                android:textStyle="bold"/>
    
        <Space android:layout_width="match_parent" android:layout_height="16dp"/>
    
        <TextView
                android:text="WebView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" android:id="@+id/textView2"
                android:textAppearance="@style/TextAppearance.AppCompat.Headline"/>
    
        <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="64dp"/>
    
    </LinearLayout>
    
    Android 8.1(API Level27)과 Android 9.0(API Level28)의 에뮬레이터를 사용하여 각각 이 에뮬레이터를 이동합니다.
    ※ 별다른 영향은 없지만 minSdkVersion은 27에서 공통으로 사용됩니다.

    Android8.1 에뮬레이터


    우선 안드로이드 8.1의 행동이다.문서를 따라가면 targetSdkVersion27은 불투명한 연한 빨간색으로 렌더링해야 합니까#ff8080?태그 요소의 표시 속성을 수정합니다.
    targetSdkVersion 27
    targetSdkVersion 28


    TextView의 경우 원하는 대로 투명도 50%#ff8080가 표시됩니다.
    WebView에 표시되면 쉽게 무시할 수 있습니다.
    현재 WebView 은 유효하지 않습니다.
    모순되지 않다.
    예를 들어, 현재 대상 애플리케이션의 API 레벨이 27 이상인 경우 WebView 의 색상 #ff8080 은 불투명한 연한 빨간색 #80ff8080 으로 렌더링됩니다.현재 첫 번째 구성 요소를 무시합니다 (Android에서 알파 구성 요소로 인식됨).
    나는 이쪽의 기술과 모순이 있다고 생각한다.

    Android9.0 에뮬레이터


    그 다음은 안드로이드 9.0의 행동이다.우리는 targetSdkVersion28의 WebView가 우리에게 색칠을 해 주기를 바란다.
    targetSdkVersion 27
    targetSdkVersion 28


    문제 없이 기대하는 행동을 했다.

    주의할 일


    API 레벨 27 이하 장치에서 8비트 태그의 색상 코드는 원래 무시되는 동작입니다.문서와 모순이 있는 것 같지만 원래부터 사용할 수 없는 것을 감안하면 유지보수 관점에서는 문제가 없는 것 같다.
    어쨌든 앞으로 "RGBA 색상 코드를 사용할 수 있는 WebView"를 사용하여 혼합 응용 프로그램을 개발하는 상황은 걱정스럽다.WebView를 대상으로 하면 디자이너가 웹 표준에 따라 RGBA로 표시된 색상 코드를 지정할 수 있는 기회가 늘어나지만 이를 Android로 직접 지정하면 의도하지 않은 색상이 됩니다.
    팀 내에서는 "안드로이드가 색상 코드에 대한 해석이 특이하다"는 것을 공유하고 응용 프로그램에서 무심코 차이가 나지 않도록 주의한다.

    잡담


    3자리와 6자리밖에 안되지만 #ff8080 컬러코드를 둘러싸면 컬러가 나옵니다. Qiita가 대단합니다.생각하면서 회사 내 Git Lab에 붙여봤더니 그쪽도 RGBA의 8자리 숫자에 대응하고 있고 이쪽이 더 세다.

    아주 쉽게 읽을 수 있어요.

    좋은 웹페이지 즐겨찾기