在 Android 8.0 中,使用者可以使用快速設定方塊或顯示設定,在自動旋轉和直向旋轉模式之間切換。在 Android 9 中,我們更新了直向旋轉模式,即使裝置位置有所變動,也能透過固定目前的螢幕旋轉角度來避免不必要的旋轉。使用者可視需要按下導覽列中的新按鈕,手動觸發旋轉功能。我們將直向模式重新命名為旋轉鎖定,並在自動旋轉功能關閉時啟用。自動旋轉模式並未變更。
當裝置處於旋轉鎖定模式時,使用者可以將螢幕鎖定為頂端可見 Activity 支援的任何旋轉模式 (根據目前的系統限制)。如果頂層活動可以在自動旋轉模式下以多種旋轉方式算繪,則旋轉鎖定模式應可使用相同的選項,但有些例外狀況則取決於活動的 screenOrientation
設定。
旋轉鎖定模式會在裝置旋轉時,在導覽列中顯示按鈕。為達成這項目標,即使關閉自動旋轉功能,裝置的方向感應器仍須保持啟用狀態。輕觸這個按鈕,即可有效設定使用者旋轉偏好設定 (Settings.System.USER_ROTATION
)。WindowManager 會使用這項偏好設定,以及頂層活動和系統狀態的其他詳細資料,變更系統的旋轉功能。當 WindowManager 決定在切換至其他活動時以何種旋轉方式算繪系統時,會繼續使用使用者旋轉偏好設定。

在活動之間移動時,應維持使用者旋轉偏好設定。不過,由於大多數手機使用者只想暫時以橫向模式使用裝置,因此我們新增了自然方向偏誤。每當系統旋轉變更為裝置的自然方向時,使用者旋轉偏好設定就會重設為裝置的自然方向。對於大多數手機,裝置的自然方向為直向 (0º)。使用僅限直向的應用程式、鎖定手機或返回啟動器工作區時,系統通常會重設使用者旋轉偏好設定。
使用者在過去十年的旋轉互動方式並沒有太大變化。由於使用者先前在導覽列中旋轉和按鈕位置的歷史記錄,因此可能會發現這項功能難以發現。因此,我們在旋轉按鈕中新增了介紹模式,在按鈕出現時會醒目顯示。只有在前幾次按鈕互動時才會出現簡介模式行為,之後就會停用。
來源
Android 9 已新增旋轉建議支援功能。大部分變更都包含在下列檔案中。
services/.../server/policy/PhoneWindowManager.java
:- 鉤子會使用
WindowOrientationListener
的輸出內容 (MyOrientationListener
,負責監控感應器,判斷裝置是否已旋轉) - 即使已停用自動旋轉功能,仍可保持
WindowOrientationListener
處於啟用狀態 (請參閱needSensorRunningLp()
) - 根據使用者旋轉偏好設定、頂層活動
screenOrientation
設定和系統狀態,計算系統旋轉 (請參閱rotationForOrientationLw()
) - 判斷頂層活動是否能旋轉至指定的旋轉角度 (請參閱
isRotationChoicePossible()
)
- 鉤子會使用
SystemUI/.../statusbar/phone/NavigationBarFragment
:- 判斷是否應在
PhoneWindowManager
的旋轉建議回呼時顯示 navbar 按鈕 (請參閱onRotationProposal()
) - 處理何時隱藏旋轉 navbar 按鈕 (請參閱對
setRotateSuggestionButtonState(false)
的呼叫) - 處理按鈕逾時問題,包括當 navbar 處於隱藏狀態時的特殊情況 (通常是在全螢幕模式下)
- 在返回裝置的自然方向 (
mRotationWatcher
) 時,重設使用者偏好設定 - 為導覽列按鈕動畫選取適當的樣式,並套用至
NavigationBarView
(請參閱onRotationProposal()
) - 新增介紹模式邏輯,包括專用動畫 (請參閱
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
的參照) - 實作 disable2 旋轉標記 (請參閱
disable()
)
- 判斷是否應在
SystemUI/.../statusbar/phone/NavigationBarView.java
:- 讓按鈕圖示動畫與待處理的旋轉動作相符 (請參閱
updateRotateSuggestionButtonStyle()
) - 處理按鈕顯示變更 (請參閱
setRotateButtonVisibility()
),包括在特定無障礙服務啟用時隱藏旋轉按鈕的邏輯 (考量最右邊的 navbar 按鈕堆疊排名)
- 讓按鈕圖示動畫與待處理的旋轉動作相符 (請參閱
SystemUI/res/layout/menu_ime.xml
:- 新增旋轉按鈕的
KeyButtonView
,疊在選單和 IME/鍵盤選擇器上方,但位於無障礙按鈕下方
- 新增旋轉按鈕的
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:- 複雜的
AnimatedVectorDrawable
,用於為旋轉的 navbar 按鈕製作動畫 - 樣式 (在
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