研究表明,屏幕发出的蓝光可能会对睡眠产生负面影响。Android 7.1.1 引入了一项名为“夜间模式”的功能,该功能可减少设备显示屏发出的蓝光量,从而更好地匹配用户一天中的时间和位置的自然光。Android 8.0 引入了一项附加功能,让用户可以更好地控制夜间模式效果的强度。Android 10 引入了 COLOR_DISPLAY_SERVICE
系统服务,并提供了一个系统 API 表面,使系统、“设置”和 System UI 能够更好地控制所有颜色转换,包括夜间模式。
夜间模式需要 Hardware Composer HAL 2.0 (HWC 2) 实现,该实现可以应用传递给 setColorTransform
的矩阵来执行着色,而不会影响功耗、性能和应用兼容性。
实现
设备制造商可以使用在 frameworks/base/core/res/res/values/config.xml
中定义的以下标志来启用该功能的默认实现。
<!-- Control whether Night display is available. This should only be enabled on devices with HWC 2 color transform support. --> <bool name="config_nightDisplayAvailable">false</bool> <!-- Default mode to control how Night display is automatically activated. One of the following values (see NightDisplayController.java): 0 - AUTO_MODE_DISABLED 1 - AUTO_MODE_CUSTOM 2 - AUTO_MODE_TWILIGHT --> <integer name="config_defaultNightDisplayAutoMode">0</integer> <!-- Default time when Night display is automatically activated. Represented as milliseconds from midnight (e.g. 79200000 == 10pm). --> <integer name="config_defaultNightDisplayCustomStartTime">79200000</integer> <!-- Default time when Night display is automatically deactivated. Represented as milliseconds from midnight (e.g. 21600000 == 6am). --> <integer name="config_defaultNightDisplayCustomEndTime">21600000</integer> <!-- Minimum color temperature, in Kelvin, supported by Night display. --> <integer name="config_nightDisplayColorTemperatureMin">2596</integer> <!-- Default color temperature, in Kelvin, to tint the screen when Night display is activated. --> <integer name="config_nightDisplayColorTemperatureDefault">2850</integer> <!-- Maximum color temperature, in Kelvin, supported by Night display. --> <integer name="config_nightDisplayColorTemperatureMax">4082</integer>
代码在框架、系统服务、System UI 和“设置”之间划分。ColorDisplayManager
(由 ColorDisplayService
提供支持)控制着核心功能。
设备制造商应根据设备显示面板的特性(包括白点、色域和所需颜色)自定义颜色斜坡。您可以使用配置叠加层来更改颜色斜坡,而无需更改基本实现。此配置表示为红色、绿色和蓝色的二次方程,形式为 vres = vat2 + vbt + vy-int,其中 t 是以开尔文为单位的温度输入,如 config_nightDisplayColorTemperatureMin
和 config_nightDisplayColorTemperatureMax
(如上一节中所述)之间的范围内指定,而 va、vb 和 vy-int 分别是给定原色曲线的 a 系数、b 系数和 y 轴截距,如下所示。
<string-array name="config_nightDisplayColorTemperatureCoefficientsNative"> <!-- R a-coefficient --> <item>0.0</item> <!-- R b-coefficient --> <item>0.0</item> <!-- R y-intercept --> <item>1.0</item> <!-- G a-coefficient --> <item>-0.00000000962353339</item> <!-- G b-coefficient --> <item>0.000153045476</item> <!-- G y-intercept --> <item>0.390782778</item> <!-- B a-coefficient --> <item>-0.0000000189359041</item> <!-- B b-coefficient --> <item>0.000302412211</item> <!-- B y-intercept --> <item>-0.198650895</item> </string-array> <string-array name="config_nightDisplayColorTemperatureCoefficients"> <!-- R a-coefficient --> <item>0.0</item> <!-- R b-coefficient --> <item>0.0</item> <!-- R y-intercept --> <item>1.0</item> <!-- G a-coefficient --> <item>-0.00000000962353339</item> <!-- G b-coefficient --> <item>0.000153045476</item> <!-- G y-intercept --> <item>0.390782778</item> <!-- B a-coefficient --> <item>-0.0000000189359041</item> <!-- B b-coefficient --> <item>0.000302412211</item> <!-- B y-intercept --> <item>-0.198650895</item> </string-array>
UI 功能
由于夜间模式是一项面向用户的功能,因此用户需要能够对其进行控制。Android 开放源代码项目 (AOSP) packages/apps/Settings 项目中提供了设置的完整实现,设备制造商可以参考该实现来完成其“设置”实现。实现者必须处理 Settings.ACTION_NIGHT_DISPLAY_SETTINGS
intent 以公开此设置。
设置
夜间模式的设置位于设置 > 显示 > 夜间模式中。用户可以在此处了解夜间模式、设置其时间表以及开启或关闭它。
- 自动开启
- 从不:夜间模式永远不会自动开启,必须使用手动开启/关闭开关激活。
- 自定义时间表:夜间模式在指定的开始时间[默认值:晚上 10:30] 开启,并在指定的结束时间[默认值:早上 6:30] 关闭。
- 日落到日出:夜间模式在日落时开启,在日出时关闭。日出和日落时间取决于设备位置和一年中的时间。
- 开启/关闭:控制夜间模式当前状态的开关。此状态遵循现有的自动规则。例如,如果在下午 5:30 开启夜间模式(在自动规则于晚上 10:30 开启夜间模式之前),夜间模式仍将在早上 6:30 关闭。如果在早上 5:30 关闭夜间模式(在夜间模式于早上 6:30 关闭之前),夜间模式仍将在晚上 10:30 开启。
- 强度:Seekbar,通过从暖色滑动到冷色来控制色调级别。当夜间模式未激活时,可以禁用 seekbar。
- 信息文本:向用户介绍夜间模式的作用及其原因。
设置条件
当夜间模式开启时,在“设置”顶部可见。
快捷设置图块
“快捷设置”图块的行为与设置 > 显示 > 夜间模式中的开启/关闭开关完全相同。