在 Android 8.0 中,使用者可以使用快速設定磁貼或顯示設定在自動旋轉和縱向旋轉模式之間切換。在 Android 9 中,我們更新了縱向旋轉模式,透過固定當前螢幕旋轉來消除意外旋轉,即使裝置位置變更也是如此。使用者可以在需要時透過按下導航列中的新按鈕手動觸發旋轉。我們將縱向模式重新命名為旋轉鎖定,並在自動旋轉關閉時啟動。自動旋轉模式沒有變化。
當裝置處於旋轉鎖定模式時,使用者可以將螢幕鎖定在頂部可見 Activity 支援的任何旋轉(考慮到目前系統限制)。如果頂部 Activity 可以在自動旋轉模式下以多次旋轉方式呈現,則相同的選項應該在旋轉鎖定模式下可用,但基於 Activity 的screenOrientation
設定有一些例外。
旋轉鎖定模式的工作原理是在裝置旋轉發生變化時在導覽列中顯示一個按鈕。為了實現這一點,即使自動旋轉關閉,設備的方向感應器也必須保持活動狀態。點選此按鈕可有效設定使用者輪替首選項 ( Settings.System.USER_ROTATION
)。 WindowManager 使用此首選項以及其他有關頂級 Activity 和系統狀態的詳細資訊來變更系統的旋轉。在移動到另一個 Activity 時決定以何種旋轉方式呈現系統時,WindowManager 繼續使用使用者旋轉首選項。
在活動之間移動時,應保持用戶輪換偏好。然而,由於大多數手機用戶只想在短時間內處於橫向狀態,因此我們添加了自然方向偏差。每當系統旋轉變更為裝置的自然方向時,使用者旋轉首選項就會重設為裝置的自然方向。對於大多數手機,設備的自然方向是縱向 (0°)。當使用僅限縱向的應用程式、鎖定手機或返回啟動器工作區時,經常會發生重置使用者旋轉首選項的情況。
在過去十年中,用戶的旋轉互動沒有太大變化。鑑於用戶先前在導覽列中進行旋轉和按鈕定位的歷史記錄,用戶可能會發現很難發現此功能。因此,我們為旋轉按鈕添加了介紹模式,當它出現時會突出顯示它。介紹模式行為僅發生在前幾個按鈕互動中,之後介紹模式被停用。
來源
Android 9 中新增了對旋轉建議的支援。大多數變更包含在以下文件中。
-
services/.../server/policy/PhoneWindowManager.java
:- 消耗
WindowOrientationListener
輸出的鉤子(MyOrientationListener
,負責監視感測器以確定裝置是否已旋轉) - 即使自動旋轉已停用,也讓
WindowOrientationListener
保持活動狀態(請參閱needSensorRunningLp()
) - 計算給定使用者旋轉首選項、頂部 Activity
screenOrientation
設定和系統狀態的系統旋轉(請參閱rotationForOrientationLw()
) - 確定頂部 Activity 是否可以旋轉到給定的旋轉(請參閱
isRotationChoicePossible()
)
- 消耗
-
SystemUI/.../statusbar/phone/NavigationBarFragment
:- 決定導覽列按鈕是否應顯示在
PhoneWindowManager
的旋轉建議回呼中(請參閱onRotationProposal()
) - 處理何時隱藏旋轉導覽列按鈕(請參閱對
setRotateSuggestionButtonState(false)
的呼叫) - 處理按鈕逾時,包含導覽列隱藏時的特殊情況(通常是全螢幕)
- 返回裝置自然方向時重設使用者首選項 (
mRotationWatcher
) - 為導覽列按鈕動畫選擇適當的樣式,套用於
NavigationBarView
(請參閱onRotationProposal()
) - 新增介紹模式邏輯,包括專門的動畫(請參閱對
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
的引用) - 實作disable2旋轉標誌(參見
disable()
)
- 決定導覽列按鈕是否應顯示在
-
SystemUI/.../statusbar/phone/NavigationBarView.java
:- 設定按鈕圖示動畫的樣式以符合待定旋轉(請參閱
updateRotateSuggestionButtonStyle()
) - 處理按鈕可見性變更(請參閱
setRotateButtonVisibility()
),包括在某些輔助功能服務處於活動狀態時隱藏旋轉按鈕的邏輯(考慮最右側的導覽列按鈕堆疊排名)
- 設定按鈕圖示動畫的樣式以符合待定旋轉(請參閱
-
SystemUI/res/layout/menu_ime.xml
:- 包括用於旋轉按鈕的新
KeyButtonView
,堆疊在選單和 IME/鍵盤選擇器上方,但在輔助功能按鈕下方
- 包括用於旋轉按鈕的新
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:- 複雜的
AnimatedVectorDrawable
用於為旋轉導覽列按鈕設定動畫 - 樣式(在
SystemUI/res/values/styles.xml
中)用於設定旋轉的開始和結束角度,因此可以使用相同的可繪製動畫來設定各種開始和結束旋轉的動畫 - 圖示著色透過
TintedKeyButtonDrawable
設定
- 複雜的
執行
Android 9 包含所有必要的更改,以使旋轉建議適用於使用軟體導航鍵(後退、主頁等)的裝置。
建立具有硬體導航鍵的裝置並希望實現此功能的裝置製造商將需要設計和實現自己的系統 UI 功能或停用該功能。建議當設備與當前系統旋轉成 90° 或 180° 時,任何引入的表面都易於使用,並且可以快速存取。由於這些原因,不建議使用通知(如對 IME/鍵盤選擇器所做的那樣)。
使用此功能的硬體需求與使用自動旋轉的要求相同。
為了實現一致性,當系統在自動旋轉關閉時出於任何原因變更為裝置的自然旋轉時,使用者旋轉首選項 ( Settings.System.USER_ROTATION
) 必須重設為裝置的自然旋轉。提供的實作可以執行此操作(請參閱NavigationBarFragment.mRotationWatcher
)。
StatusBarManager.disable2
中有一個新標誌可以暫時阻止出現旋轉建議。請參閱StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
。在所有實作中都必須遵守此標誌,因為它由關鍵系統應用程式(包括設定精靈)使用。提供的實作支援這一點(請參閱NavigationBarFragment.disable()
)。
如果可能的話,我們強烈建議啟用該功能並遵循 AOSP 實作。我們的目標是保持設備之間的旋轉體驗相似,反映當今大多數手機上自動旋轉和縱向鎖定之間體驗的一致性。
客製化
由於旋轉建議僅在旋轉鎖定模式(自動旋轉關閉)下出現,因此可以透過選擇預設會自動旋轉關閉來選擇該功能是否對於新安裝預設開啟。請參閱SettingsProvider/res/values/defaults.xml
中的def_accelerometer_rotation
進行預設變更。
使用者可以透過快速設定或顯示設定中的旋轉圖塊輕鬆變更自動旋轉是否處於活動狀態(無論預設值為何)。
驗證
為了進行測試,可以透過更改門控Settings.Secure
值來關閉和開啟該功能。透過從特權 adb 實例執行以下命令,可以最輕鬆地完成此操作:
adb shell settings put secure show_rotation_suggestions <x>
將 x 設定為0
表示關閉,設定為1
表示開啟。
為了進行測試,可以透過變更關聯的Settings.Secure
值來重置介紹模式。透過從特權 adb 實例執行以下命令,可以最輕鬆地完成此操作:
adb shell settings put secure num_rotation_suggestions_accepted 0