安卓开发必备颜色知识

前言

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已可接受更高比特精度颜色)。

如今频繁和现代显示设备打交道,设计师和开发者需了解色彩空间、颜色管理等知识及如何在应用中付诸实施。越来越多设备开始提供广色域显示和颜色精确渲染,此时领先一步尤显必要,更新应用,为用户提供最佳体验。这是向用户提供卓越体验最佳方式,确保用户所看颜色即开发者想展示颜色。

相关推荐