實作夜燈

研究顯示,螢幕發出的藍光可能會對睡眠造成負面影響。Android 7.1.1 推出了夜燈功能,可減少裝置螢幕發出的藍光量,以便配合使用者所在位置和時間的自然光線。Android 8.0 推出了額外功能,讓使用者進一步控管夜燈效果的強度。Android 10 推出 COLOR_DISPLAY_SERVICE 系統服務,其中包含系統 API 途徑,可讓系統、設定和系統 UI 對所有色彩轉換 (包括夜間模式) 提供更多控制權。

Night Light 需要硬體編寫器 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 支援)。

裝置製造商應根據裝置顯示面板的特性自訂色階,包括白點、色域和所需顏色。您可以使用設定疊加層,在不變更基本實作內容的情況下變更色階。這項設定會以二次方程式表示紅、綠、藍三種顏色,格式為 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>

UI 功能

由於夜燈是面向使用者的功能,使用者必須能夠控制這項功能。Android 開放原始碼專案 (AOSP) 的 packages/apps/Settings 專案中,有完整的設定實作項目,裝置製造商可參考這些項目來實作設定。實作者必須處理 Settings.ACTION_NIGHT_DISPLAY_SETTINGS 意圖,才能公開這項設定。

設定

夜燈的設定位於「設定」>「顯示」>「夜燈」。使用者可以透過這項功能瞭解夜燈功能、設定時間表,以及開啟或關閉夜燈。

  • 自動開啟
    • 永不:夜燈不會自動開啟,必須透過手動開啟 / 關閉切換鈕才能啟用。
    • 自訂時間表:夜燈會在指定的開始時間 [預設為晚上 10 點 30 分] 開啟,並在指定的結束時間 [預設為上午 6 點 30 分] 關閉。
    • 日落到日出:夜燈會在日落時開啟,並在日出時關閉。日出和日落時間取決於裝置所在位置和時節。
  • 開啟 / 關閉:切換按鈕,用於控制夜燈的目前狀態。這個狀態會遵循現有的自動規則。舉例來說,如果夜燈模式在下午 5 點 30 分開啟 (自動規則會在下午 10 點 30 分開啟),夜燈模式仍會在早上 6 點 30 分關閉。如果夜燈模式在早上 5 點 30 分 (即在早上 6 點 30 分關閉前) 關閉,系統仍會在晚上 10 點 30 分開啟。
  • 強度: 滑桿:用來控制色調等級,滑動時會從暖色調變為冷色調。未啟用夜燈時,可停用進度列。
  • 資訊文字:說明 Night Light 的功能和用途。

設定條件

夜燈模式開啟時,會顯示在「設定」頂端。

快速設定方塊

快速設定方塊的運作方式與「設定」>「顯示」>「夜燈」中的「開啟 / 關閉」切換鈕相同。