研究顯示,螢幕發出的藍光可能會對睡眠造成負面影響。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_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
意圖,才能公開這項設定。
設定
夜燈的設定位於「設定」>「顯示」>「夜燈」。使用者可以透過這項功能瞭解夜燈功能、設定時間表,以及開啟或關閉夜燈。
- 自動開啟
- 永不:夜燈不會自動開啟,必須透過手動開啟 / 關閉切換鈕才能啟用。
- 自訂時間表:夜燈會在指定的開始時間 [預設為晚上 10 點 30 分] 開啟,並在指定的結束時間 [預設為上午 6 點 30 分] 關閉。
- 日落到日出:夜燈會在日落時開啟,並在日出時關閉。日出和日落時間取決於裝置所在位置和時節。
- 開啟 / 關閉:切換按鈕,用於控制夜燈的目前狀態。這個狀態會遵循現有的自動規則。舉例來說,如果夜燈模式在下午 5 點 30 分開啟 (自動規則會在下午 10 點 30 分開啟),夜燈模式仍會在早上 6 點 30 分關閉。如果夜燈模式在早上 5 點 30 分 (即在早上 6 點 30 分關閉前) 關閉,系統仍會在晚上 10 點 30 分開啟。
- 強度: 滑桿:用來控制色調等級,滑動時會從暖色調變為冷色調。未啟用夜燈時,可停用進度列。
- 資訊文字:說明 Night Light 的功能和用途。
設定條件
夜燈模式開啟時,會顯示在「設定」頂端。
快速設定方塊
快速設定方塊的運作方式與「設定」>「顯示」>「夜燈」中的「開啟 / 關閉」切換鈕相同。