實施夜燈

研究表明,螢幕發出的藍光會對睡眠產生負面影響。 Android 7.1.1 引入了一項名為「夜燈」的功能,可減少裝置顯示器發出的藍光量,以更好地匹配用戶一天中的時間和位置的自然光。 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意圖來公開此設定。

設定

夜燈的設定位於設定 > 顯示 > 夜燈中。從那裡,用戶可以了解夜燈、設定其時間表以及打開或關閉它。

  • 自動開啟
    • 從不:夜燈永遠不會自動打開,必須透過手動開/關切換來啟動。
    • 自訂時間表:夜燈在指定的開始時間[預設:晚上 10:30] 打開,並在指定的結束時間[預設:上午 6:30] 關閉。
    • 日落到日出:夜燈在日落時打開,在日出時關閉。日出和日落的時間取決於設備位置和一年中的時間。
  • 開/關:控制夜燈目前狀態的切換。此狀態尊重現有的自動規則。例如,如果夜燈在下午 5:30 打開(自動規則會在晚上 10:30 打開夜燈之前),夜燈仍會在上午 6:30 關閉,如果夜燈在早上 5 點關閉:30 am(早上6:30 關閉前),晚上10:30 仍會開啟
  • 強度: Seekbar ,透過從暖色滑動到冷色來控制色調等級。當夜燈未啟動時,可以停用搜尋欄。
  • 資訊文字:教導使用者夜燈的作用及其原因。

設定條件

當夜燈打開時,在「設定」頂部可見。

快速設定圖塊

「快速設定」圖塊的行為與「設定」>「顯示」>「夜燈」中的開/關切換相同。