实现夜间模式

研究表明,屏幕的蓝光会对睡眠质量造成不良影响。Android 7.1.1 推出一种称为“夜间模式”的功能,可减少设备屏幕发出的蓝光量,以便达到更接近用户当前时间和地点的自然光效果。Android 8.0 推出一项附加功能,可让用户更好地控制夜间模式效果的强度。Android 10 推出 COLOR_DISPLAY_SERVICE 系统服务,具备系统 API Surface,使系统、“设置”和系统界面能够更好地控制所有颜色转换(包括夜间模式)。

夜间模式需要实现 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>

这段代码包含用于框架、系统服务、系统界面和“设置”的代码。核心功能由 ColorDisplayManager(由 ColorDisplayService 支持)控制。

设备制造商应根据设备显示面板的特性(包括白点、色域和所需颜色)自定义颜色梯度。您可以使用配置叠加更改颜色梯度,而不更改基本实现。此配置表示为红色、绿色和蓝色中每一种颜色的二次方程,其形式为 vres = vat2 + vbt + vy-int,其中 t 是以开尔文为单位的温度输入,根据 config_nightDisplayColorTemperatureMinconfig_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>

界面功能

由于夜间模式是面向用户的功能,因此用户需要能够掌控这项功能。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 开启夜间模式。
  • 强度:通过从暖色调滑动到冷色调来控制着色程度的拖动条。在未启用夜间模式时,可以停用拖动条。
  • 信息性文本:向用户介绍夜间模式的功能和原理。

设置条件语句

当夜间模式处于开启状态时,用户可以在“设置”顶部看到。

“快捷设置”图块

用户可以通过“快捷设置”图块执行相应操作,也可以通过“设置”>“显示”>“夜间模式”中的开启/关闭切换开关执行相应操作,两者效果是一样的。