實施夜燈

研究表明,屏幕發出的藍光會對睡眠產生負面影響。 Android 7.1.1 引入了一項名為 Night Light 的功能,可減少設備顯示屏發出的藍光量,以更好地匹配用戶一天中時間和位置的自然光。 Android 8.0 引入了一項附加功能,讓用戶可以更好地控制夜燈效果​​的強度。 Android 10 引入了COLOR_DISPLAY_SERVICE系統服務,它具有系統 API 界面,可讓系統、設置和系統 UI 更好地控制所有顏色轉換,包括夜燈。

Night Light 需要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>
中定義的以下標誌來啟用該功能的默認實現

代碼分為框架、系統服務、系統 UI 和設置。核心功能由ColorDisplayManager控制(由ColorDisplayService支持)。

設備製造商應根據設備顯示面板的特性定制色帶,包括白點、色域和所需顏色。您可以使用配置覆蓋更改色帶,而無需更改基本實現。此配置表示為紅色、綠色和藍色中的每一個的二次方程,形式為 v res = v a t 2 + v b t + v y-int其中 t 是以開爾文為單位的溫度輸入,如config_nightDisplayColorTemperatureMinconfig_nightDisplayColorTemperatureMax之間的範圍(如上一節所述),並且 v a 、 v b和 v y-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)包/應用程序/設置項目中有設置的完整實現,設備製造商可以參考其設置實現。實施者必須處理Settings.ACTION_NIGHT_DISPLAY_SETTINGS意圖以公開此設置。

設置

夜燈的設置位於Settings > Display > Night Light中。從那裡,用戶可以了解夜燈、設置其時間表以及打開或關閉它。

  • 自動開啟
    • 從不:夜燈永遠不會自動打開,必須通過手動開/關切換來激活。
    • 自定義時間表:夜燈在指定的開始時間打開[默認:晚上 10:30],在指定的結束時間關閉 [默認:上午 6:30]。
    • 日落到日出:夜燈在日落時打開,在日出時關閉。日出和日落時間取決於設備位置和一年中的時間。
  • 開/關:切換控制夜燈的當前狀態。此狀態尊重現有的自動規則。例如,如果夜燈在下午 5:30 開啟(在自動規則會在晚上 10:30 開啟之前),夜燈仍將在上午 6:30 關閉並且如果夜燈在下午 5 點關閉:30 am(在早上 6:30 關閉之前),它仍然會在晚上 10:30 開啟
  • 強度: Seekbar通過從暖色滑到冷色來控制色調水平。未激活夜燈時可以禁用搜索欄。
  • 信息文本:告訴用戶夜燈的作用以及原因。

設置條件

夜燈打開時在設置頂部可見。

快速設置磁貼

快速設置磁貼的行為與設置 > 顯示 > 夜燈中的開/關切換相同。