旋轉建議

在 Android 8.0 中,使用者可以使用快速設定方塊或顯示設定,在自動旋轉和直向旋轉模式之間切換。在 Android 9 中,我們更新了直向旋轉模式,即使裝置位置有所變動,也能透過固定目前的螢幕旋轉角度來避免不必要的旋轉。使用者可視需要按下導覽列中的新按鈕,手動觸發旋轉功能。我們將直向模式重新命名為旋轉鎖定,並在自動旋轉功能關閉時啟用。自動旋轉模式並未變更。

當裝置處於旋轉鎖定模式時,使用者可以將螢幕鎖定為頂端可見 Activity 支援的任何旋轉模式 (根據目前的系統限制)。如果頂層活動可以在自動旋轉模式下以多種旋轉方式算繪,則旋轉鎖定模式應可使用相同的選項,但有些例外狀況則取決於活動的 screenOrientation 設定。

旋轉鎖定模式會在裝置旋轉時,在導覽列中顯示按鈕。為達成這項目標,即使關閉自動旋轉功能,裝置的方向感應器仍須保持啟用狀態。輕觸這個按鈕,即可有效設定使用者旋轉偏好設定 (Settings.System.USER_ROTATION)。WindowManager 會使用這項偏好設定,以及頂層活動和系統狀態的其他詳細資料,變更系統的旋轉功能。當 WindowManager 決定在切換至其他活動時以何種旋轉方式算繪系統時,會繼續使用使用者旋轉偏好設定。

這張 GIF 顯示手機處於橫向模式,螢幕為直向。系統會顯示圖示,詢問使用者是否要將螢幕方向變更為橫向。
圖 1. 啟用「在主畫面按鈕上向上滑動」手勢時,旋轉建議按鈕

在活動之間移動時,應維持使用者旋轉偏好設定。不過,由於大多數手機使用者只想暫時以橫向模式使用裝置,因此我們新增了自然方向偏誤。每當系統旋轉變更為裝置的自然方向時,使用者旋轉偏好設定就會重設為裝置的自然方向。對於大多數手機,裝置的自然方向為直向 (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