Vorschläge drehen

In Android 8.0 konnten Benutzer über eine Schnelleinstellungskachel oder Anzeigeeinstellungen zwischen den Modi „Automatische Drehung“ und „Hochformat“ wechseln. In Android 9 haben wir den Porträtdrehmodus aktualisiert, um unbeabsichtigte Drehungen zu verhindern, indem wir die aktuelle Bildschirmdrehung auch dann fixieren, wenn sich die Geräteposition ändert. Benutzer können die Rotation bei Bedarf manuell auslösen, indem sie eine neue Schaltfläche in der Navigationsleiste drücken. Wir haben den Porträtmodus in „Rotationssperre“ umbenannt und er wird aktiviert, wenn die automatische Drehung deaktiviert ist. Es gibt keine Änderungen am automatischen Rotationsmodus.

Wenn sich das Gerät im Rotationssperrmodus befindet, können Benutzer ihren Bildschirm auf jede Drehung sperren, die von der oberen, sichtbaren Aktivität unterstützt wird (unter Berücksichtigung der aktuellen Systembeschränkungen). Wenn die obere Aktivität im automatischen Rotationsmodus in mehreren Rotationen gerendert werden kann, sollten dieselben Optionen im Rotationssperrmodus verfügbar sein, mit einigen Ausnahmen, die auf der screenOrientation Einstellung der Aktivität basieren.

Der Rotationssperrmodus funktioniert, indem bei Änderungen der Geräterotation eine Schaltfläche in der Navigationsleiste angezeigt wird. Um dies zu erreichen, muss der Ausrichtungssensor des Geräts auch dann aktiv bleiben, wenn die automatische Drehung ausgeschaltet ist. Durch Tippen auf diese Schaltfläche wird effektiv die Rotationspräferenz des Benutzers festgelegt ( Settings.System.USER_ROTATION ). WindowManager verwendet diese Einstellung zusammen mit anderen Details zur obersten Aktivität und zum Systemstatus, um die Rotation des Systems zu ändern. WindowManager verwendet weiterhin die Rotationspräferenz des Benutzers, wenn er entscheidet, in welcher Rotation das System gerendert werden soll, wenn zu einer anderen Aktivität gewechselt wird.

Dieses GIF zeigt ein Telefon im Querformat mit dem Bildschirm im Hochformat. Es erscheint ein Symbol, das den Benutzer fragt, ob er die Bildschirmausrichtung ins Querformat ändern möchte.
Abbildung 1 . Drehen Sie die Vorschlagsschaltfläche mit aktivierter Geste „Auf der Home-Schaltfläche nach oben wischen“.

Beim Wechsel zwischen Aktivitäten sollte die Rotationspräferenz des Benutzers beibehalten werden. Da sich die meisten Telefonbenutzer jedoch nur für einen kurzen, vorübergehenden Zeitraum im Querformat aufhalten möchten, haben wir den natürlichen Ausrichtungsbias hinzugefügt. Die Rotationspräferenz des Benutzers wird immer dann auf die natürliche Ausrichtung des Geräts zurückgesetzt , wenn sich die Systemdrehung in die natürliche Ausrichtung des Geräts ändert. Bei den meisten Telefonen ist die natürliche Ausrichtung des Geräts Hochformat (0°). Das Zurücksetzen der Benutzerrotationspräferenz erfolgt häufig, wenn Sie eine App nur im Hochformat verwenden, das Telefon sperren oder zum Launcher-Arbeitsbereich zurückkehren.

Die Rotationsinteraktionen für Benutzer haben sich im letzten Jahrzehnt nicht wesentlich verändert. Für Benutzer ist diese Funktion aufgrund ihrer Vorgeschichte mit Drehung und Tastenpositionierung in der Navigationsleiste möglicherweise schwer zu entdecken. Aus diesem Grund haben wir der Schaltfläche „Drehen“ einen Einführungsmodus hinzugefügt, der sie beim Erscheinen hervorhebt. Das Verhalten im Einführungsmodus tritt nur bei den ersten Tasteninteraktionen auf. Danach wird der Einführungsmodus deaktiviert.

Quelle

Unterstützung für Rotationsvorschläge wurde Android 9 hinzugefügt. Die meisten Änderungen sind in den folgenden Dateien enthalten.

  • services/.../server/policy/PhoneWindowManager.java :
    • Hooks, die die Ausgabe von WindowOrientationListener verbrauchen ( MyOrientationListener , verantwortlich für die Überwachung von Sensoren, um festzustellen, ob das Gerät gedreht wurde)
    • Hält den WindowOrientationListener aktiv, auch wenn die automatische Drehung deaktiviert ist (siehe needSensorRunningLp() ).
    • Berechnet die Systemrotation anhand der Rotationspräferenz des Benutzers, der oberen screenOrientation und des Systemstatus (siehe rotationForOrientationLw() ).
    • Bestimmen Sie, ob sich die oberste Aktivität um eine bestimmte Rotation drehen kann (siehe isRotationChoicePossible() ).
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Legt fest, ob die Navigationsleistenschaltfläche bei Rotationsvorschlagsrückrufen von PhoneWindowManager angezeigt werden soll (siehe onRotationProposal() )
    • Behandelt, wann die Schaltfläche zum Drehen der Navigationsleiste ausgeblendet werden soll (siehe Aufrufe von setRotateSuggestionButtonState(false) ).
    • Behandelt Schaltflächen-Timeouts, einschließlich des Sonderfalls, wenn die Navigationsleiste ausgeblendet ist (normalerweise im Vollbildmodus).
    • Setzt die Benutzerpräferenz bei der Rückkehr zur natürlichen Ausrichtung des Geräts zurück ( mRotationWatcher )
    • Wählt den geeigneten Stil für die Navigationsleisten-Schaltflächenanimation aus, die in NavigationBarView angewendet wird (siehe onRotationProposal() ).
    • Fügt Logik für den Einführungsmodus hinzu, einschließlich spezieller Animationen (siehe Verweise auf Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED ).
    • Implementiert das Rotationsflag „disable2“ (siehe disable() “).
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Stilt die Animation des Schaltflächensymbols so, dass sie der ausstehenden Drehung entspricht (siehe updateRotateSuggestionButtonStyle() ).
    • Behandelt Änderungen der Schaltflächensichtbarkeit (siehe setRotateButtonVisibility() ), einschließlich der Logik zum Ausblenden der Drehschaltfläche, wenn bestimmte Barrierefreiheitsdienste aktiv sind (unter Berücksichtigung der Stapelrangfolge der Schaltflächen ganz rechts in der Navigationsleiste).
  • SystemUI/res/layout/menu_ime.xml :
    • Enthält eine neue KeyButtonView für die Schaltfläche „Drehen“, die oberhalb des Menüs und der IME-/Tastaturauswahl, aber unterhalb der Schaltfläche „Eingabehilfen“ angeordnet ist
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Komplexes AnimatedVectorDrawable das zum Animieren der Schaltfläche zum Drehen der Navigationsleiste verwendet wird
    • Styling (in SystemUI/res/values/styles.xml ) wird verwendet, um den Start- und Endwinkel der Drehung festzulegen, sodass dasselbe Zeichenelement zum Animieren verschiedener Start- und Enddrehungen verwendet werden kann
    • Die Symboltönung wird über TintedKeyButtonDrawable festgelegt

Implementierung

Android 9 enthält alle notwendigen Änderungen, damit Rotationsvorschläge für Geräte funktionieren, die Software-Navigationstasten (Zurück, Startseite usw.) verwenden.

Gerätehersteller, die Geräte mit Hardware-Navigationstasten erstellen, die diese Funktion implementieren möchten, müssen ihr eigenes System-UI-Angebot entwerfen und implementieren oder die Funktion deaktivieren. Es wird empfohlen, dass jede eingeführte Oberfläche einfach zu bedienen ist, wenn das Gerät im 90°- oder 180°-Winkel zur aktuellen Systemdrehung gehalten wird und schnell zugänglich ist. Aus diesen Gründen wird die Verwendung von Benachrichtigungen (wie sie für die IME-/Tastaturauswahl erfolgt) nicht empfohlen.

Die Hardware-Anforderungen zur Nutzung dieser Funktion sind dieselben wie die Anforderungen zur Verwendung der automatischen Drehung.

Aus Gründen der Implementierungskonsistenz ist es erforderlich, dass die Benutzerrotationspräferenz ( Settings.System.USER_ROTATION ) auf die natürliche Rotation des Geräts zurückgesetzt wird, wenn das System aus irgendeinem Grund zur natürlichen Rotation des Geräts wechselt, wenn die automatische Drehung deaktiviert ist. Die bereitgestellte Implementierung erledigt dies (siehe NavigationBarFragment.mRotationWatcher ).

In StatusBarManager.disable2 gibt es ein neues Flag, um die Anzeige von Rotationsvorschlägen vorübergehend zu verhindern. Siehe StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Dieses Flag muss in allen Implementierungen respektiert werden, da es von kritischen System-Apps, einschließlich des Setup-Assistenten, verwendet wird. Die bereitgestellte Implementierung unterstützt dies (siehe NavigationBarFragment.disable() ).

Wir empfehlen dringend, die Funktion zu aktivieren und nach Möglichkeit der AOSP-Implementierung zu folgen. Unser Ziel ist es, das Rotationserlebnis zwischen den Geräten ähnlich zu halten und so das einheitliche Erlebnis bei den meisten heutigen Telefonen zwischen automatischer Drehung und Porträtsperre widerzuspiegeln.

Anpassung

Da Rotationsvorschläge nur im Rotationssperrmodus (automatische Rotation aus) angezeigt werden, können Sie festlegen, ob die Funktion bei Neuinstallationen standardmäßig aktiviert ist, indem Sie die automatische Rotation standardmäßig deaktivieren. Informationen zum Vornehmen von Standardänderungen finden Sie unter def_accelerometer_rotation in SettingsProvider/res/values/defaults.xml .

Benutzer können über die Rotationskachel in den Schnelleinstellungen oder in den Anzeigeeinstellungen ganz einfach ändern, ob die automatische Drehung aktiv ist oder nicht (unabhängig von der Standardeinstellung).

Validierung

Zu Testzwecken kann die Funktion durch Ändern eines Gating- Settings.Secure Werts ein- und ausgeschaltet werden. Dies lässt sich am einfachsten erreichen, indem Sie den folgenden Befehl von einer privilegierten ADB-Instanz aus ausführen:

adb shell settings put secure show_rotation_suggestions <x>

Setzen Sie x auf 0 für Aus und 1 für Ein.

Zu Testzwecken kann der Einführungsmodus durch Ändern des zugehörigen Settings.Secure Werts zurückgesetzt werden. Dies lässt sich am einfachsten erreichen, indem Sie den folgenden Befehl von einer privilegierten ADB-Instanz aus ausführen:

adb shell settings put secure num_rotation_suggestions_accepted 0