画面の回転の提案

Android 8.0 では、QuickSettings タイルやディスプレイの設定を使用して、自動回転モードと縦向き回転モードを切り替えることができました。Android 9 では、縦向き回転モードが更新されて、デバイスの向きが変わっても現在の画面の向きが固定され、意図しない回転が発生しなくなりました。ユーザーは必要に応じてナビゲーション バーの新しいボタンを押すことで、手動で回転させることができます。 縦向きモードは名前を変更して回転ロックとなっており、画面の自動回転がオフの場合に有効になります。自動回転モードに変更はありません。

デバイスが回転ロックモードになっている場合、ユーザーは現在のシステム制約を考慮して最前面に表示されているアクティビティに応じて画面の向きを固定できます。最前面のアクティビティを自動回転モードで複数の向きにレンダリングできる場合、回転ロックモードでも同じ選択肢を使用できますが、アクティビティの screenOrientation 設定に基づいた例外もいくつかあります。

回転ロックモードは、デバイスの向きが変わったときに、ナビゲーション バーにボタンを表示することで機能します。これを行うには、自動回転がオフのときでもデバイスの向きセンサーを有効にしておく必要があります。このボタンをタップすると、ユーザーの画面の向きの設定(Settings.System.USER_ROTATION)が効果的に行われます。WindowManager は、この設定と、最前面のアクティビティとシステム ステータスに関するその他の詳細を使用してシステムの画面の向きを変更します。WindowManager は、他のアクティビティに移動する際のシステムを表示する向きの決定に、引き続きユーザーの画面の向きの設定を使用します。

この GIF は、横向きにしても縦向きの画面が表示されるスマートフォンを示しています。画面の向きを横向きに変更するかどうかをユーザーに尋ねるアイコンが表示されます。
図 1. 「ホームボタンを上にスワイプ」操作を有効にした状態での回転提案ボタン

アクティビティ間を移動する場合は、ユーザーの画面の向きの設定を維持する必要があります。 ただし、多くの場合、ユーザーがスマートフォンを横向きで使用するのは短時間かつ一時的にすぎないため、自然な向きのバイアスが追加されました。ユーザーの画面の向きの設定は、システムの向きがデバイスの自然な向きに変わるたびに、デバイスの自然な向きにリセットされます。ほとんどのスマートフォンでは、デバイスの自然な向きは縦です(0 度)。縦向き専用のアプリの使用時、スマートフォンのロック時、またはランチャーのワークスペースに戻るときに、ユーザーの画面の向きの設定が頻繁にリセットされます。

過去 10 年間で、ユーザーの画面の回転操作は大きく変化していません。過去の回転操作の履歴やナビゲーション バー内のボタン配置を考えると、この機能はユーザーにとって見つけにくい可能性があります。そのため、回転ボタンが表示されたときにそれをハイライト表示する導入モードが追加されました。導入モードは、最初の数回のボタン操作に対してのみ動作し、その後は無効になります。

ソース

画面の回転の提案のサポートが Android 9 に追加されました。ほとんどの変更は、以下のファイルに含まれています。

  • services/.../server/policy/PhoneWindowManager.java:
    • WindowOrientationListenerMyOrientationListener、デバイスが回転したかどうかを判断するセンサーをモニタリング)の出力の消費をフックします
    • 自動回転が無効になっている場合でも、WindowOrientationListener は常に有効にします(needSensorRunningLp() をご覧ください)
    • ユーザーの画面の向きの設定、最前面のアクティビティの screenOrientation 設定、システム ステータスを考慮してシステム ローテーションを計算します(rotationForOrientationLw() をご覧ください)
    • 最前面のアクティビティが特定の画面の向きに回転できるかどうかを判断します(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:
    • メニューと IME / キーボードのチューザの上(ユーザー補助機能ボタンの下)に積み重ねられた回転ボタンの新しい KeyButtonView が含まれます
  • 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 の実装に従うことを強くおすすめします。Google は、デバイス間で同様の回転の操作性を維持し、今日のほとんどのスマートフォンで画面の自動回転と縦向き固定との間の一貫したエクスペリエンスを実現することを目指しています。

カスタマイズ

画面の回転の提案は、回転ロックモード(自動回転はオフ)でのみ表示されるため、自動回転をデフォルトでオフにすることで、新しいインストールでこの機能をデフォルトでオンにするかどうかを選択することも可能です。デフォルトの変更を行うには、SettingsProvider/res/values/defaults.xmldef_accelerometer_rotation をご覧ください。

ユーザーは、自動回転を有効にするかどうか(デフォルトにかかわらず)を、QuickSettings の回転タイルやディスプレイの設定で簡単に変更できます。

検証

テストの際は、ゲートの 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