研究表明,螢幕發出的藍光會對睡眠產生負面影響。 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_nightDisplayColorTemperatureMin
和config_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 ,透過從暖色滑動到冷色來控制色調等級。當夜燈未啟動時,可以停用搜尋欄。
- 資訊文字:教導使用者夜燈的作用及其原因。
設定條件
當夜燈打開時,在「設定」頂部可見。
快速設定圖塊
「快速設定」圖塊的行為與「設定」>「顯示」>「夜燈」中的開/關切換相同。