Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

画面の回転の提案

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

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

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

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

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

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

ソース

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

  • 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 P には、ソフトウェア ナビゲーション キー(戻る、ホームなど)を使用するデバイス向けの画面の回転の提案を取得するために必要な変更がすべて含まれています。

この機能を実装できるハードウェア ナビゲーション キーのデバイスを作成するデバイスのメーカーは、独自のシステム 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 に、オンにするには x を 1 に設定します。

テストの場合、導入モードは関連する Settings.Secure 値を変更することでリセットできます。これは、次のコマンドを権限のある adb インスタンスから実行することで最も簡単に行えます。

adb shell settings put secure num_rotation_suggestions_accepted 0