安卓開發必備顏色知識

snp發表於2018-01-09

前言

Oreo版Android開始獲顏色管理支援,有助不同裝置顏色校準。隨此更新到來,Android裝置可顯sRGB色域外顏色。

簡單說,顏色管理可保顏色在不同顯示器看起來一致。如顏色#ff0000(紅色)出現於不同技術螢幕,看到的顏色可能有所不同,有些螢幕可顯比其它螢幕更飽和或更強烈顏色。據sRGB表達方式,#ff0000表一特定紅色(sRGB色空間中),這樣彩色顯示管理即可精確產生符合觀眾期望顏色。

廣色域影象顯示

影象可嵌入顏色配置檔案,宣告其顏色資訊所屬顏色空間。類似許多相機能捕捉廣色域並嵌入適當顏色配置檔案,從而顯超出標準sRGB色域顏色。應用中展示具有廣色域特徵影象需在每Activity宣告,即在manifestactivitycolorMode屬性:

安卓開發必備顏色知識
也可Window建立前於onCreate程式碼設定。廣色域支援為可選,因它需更多系統資源(可能致應用效能下降),開發者文件強調:

啟用廣色域模式時活動視窗用更多記憶體和GPU處理能力進行畫面組合。啟用廣色域模式前應仔細考慮活動能否真正從中受益。全屏顯示照片活動很適合採用廣色域模式而顯示縮圖介面不夠適合。
複製程式碼

注意用單一Activity架構則將廣色域影象顯示分解為新Activity可能有意義。

下面示例呈現兩顯示相同廣色域測試影象介面(嵌入Display P3顏色配置檔案的PNG檔案),畫面上部分Activity宣告廣色域顏色模式而下半部分Activity無宣告。螢幕支援則上部分應能見一Android小機器人而下部分不見。

安卓開發必備顏色知識

顏色準確渲染

許多Android裝置很久前即擁有顯較廣色域螢幕。Android 8.0顏色管理前所有內容被假定sRGB,但寬色域顯示器將顏色值重解釋為其工作色域並有效對顏色值換算(一般紅更紅,綠更綠)致更飽和成像效果。但這種拉伸不精確,實際不存在預測所想顏色的換算演算法。

許多應用已對影象等資源進行處理,如降低一些飽和度進行顏色彌補。在具校準顯示功能裝置顯示時顏色可能較柔和。在顏色顯示精確裝置(如Pixel 2),非飽和圖片資源顯示效果將不如顯示不精確裝置飽滿。準確顏色渲染技術廣泛流行後應用開發者無需對資源顏色自行處理並保內容按期顯示。然此前可採取措施保內容在顏色精確顯示器及非顏色管理裝置看起來同樣棒。

Android 8.0添一新widecg資源限定符(resource qualifier),該限定符可更改配備廣色域螢幕並支援廣色域渲染裝置上顏色(nowidecg相反)。

注意廣色域支援不同於當前活動是否在wideColorGamut顏色模式執行。裝置支援顏色準確渲染則該限定符適用,而不論該活動是否於寬色域模式執行。

應用可在res/values/colors.xml宣告一基色調色盤:

安卓開發必備顏色知識
並在res/values-widecg/colors.xml宣告另一套設定
安卓開發必備顏色知識
如上程式碼所示,可為色彩顯示準確裝置(左側)和較舊裝置提供不同顏色:
安卓開發必備顏色知識
當然可在可柵格化成點陣圖資源用上述做法(如res/drawable-widecg-mdpi/foo.png),但這意味應用體積幾乎倍增,也許不值。定要做可考慮用可動態著色的向量圖形。

更廣支援即將到來

雖最近宣佈計劃添一新飽和顏色模式,讓使用者選擇不用顏色精確渲染(像nowidecg裝置),但仍認為那些擁有顏色管理功能裝置更新應用非常重要。更新應用並更好支援顏色準確渲染,選擇退出此模式使用者會變少,畢竟大家更喜歡精準顏色。故計劃在廣色域支援領域繼續進行投入,在將來版中添更多API介面處理廣色域(如更新後的Paint APICanvas API已可接受更高位元精度顏色)。

如今頻繁和現代顯示裝置打交道,設計師和開發者需瞭解色彩空間、顏色管理等知識及如何在應用中付諸實施。越來越多裝置開始提供廣色域顯示和顏色精確渲染,此時領先一步尤顯必要,更新應用,為使用者提供最佳體驗。這是向使用者提供卓越體驗最佳方式,確保使用者所看顏色即開發者想展示顏色。

相關文章