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.
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 (sieheneedSensorRunningLp()
). - Berechnet die Systemrotation anhand der Rotationspräferenz des Benutzers, der oberen
screenOrientation
und des Systemstatus (sieherotationForOrientationLw()
). - Bestimmen Sie, ob sich die oberste Aktivität um eine bestimmte Rotation drehen kann (siehe
isRotationChoicePossible()
).
- Hooks, die die Ausgabe von
-
SystemUI/.../statusbar/phone/NavigationBarFragment
:- Legt fest, ob die Navigationsleistenschaltfläche bei Rotationsvorschlagsrückrufen von
PhoneWindowManager
angezeigt werden soll (sieheonRotationProposal()
) - 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 (sieheonRotationProposal()
). - 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()
“).
- Legt fest, ob die Navigationsleistenschaltfläche bei Rotationsvorschlagsrückrufen von
-
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).
- Stilt die Animation des Schaltflächensymbols so, dass sie der ausstehenden Drehung entspricht (siehe
-
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
- Enthält eine neue
-
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
- Komplexes
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