Di Android 8.0, pengguna dapat beralih antara mode putar otomatis dan putar potret menggunakan kartu Setelan cepat atau setelan Tampilan. Di Android 9, kami memperbarui mode rotasi potret untuk menghilangkan rotasi yang tidak disengaja dengan menyematkan rotasi layar saat ini meskipun posisi perangkat berubah. Pengguna dapat memicu rotasi secara manual jika diperlukan dengan menekan tombol baru di menu navigasi. Kami mengganti nama mode potret menjadi kunci rotasi dan mode ini akan aktif saat putar otomatis dinonaktifkan. Tidak ada perubahan pada mode putar otomatis.
Saat perangkat dalam mode kunci rotasi, pengguna dapat mengunci layar ke
rotasi apa pun yang didukung oleh Aktivitas atas yang terlihat (mengingat batasan sistem
saat ini). Jika Aktivitas teratas dapat dirender dalam beberapa rotasi dalam
mode putar otomatis, opsi yang sama akan tersedia dalam mode rotasi terkunci,
dengan beberapa pengecualian berdasarkan setelan screenOrientation
Aktivitas.
Mode kunci rotasi berfungsi dengan menampilkan tombol di menu navigasi saat perubahan
rotasi perangkat. Untuk melakukannya, sensor orientasi perangkat harus tetap aktif
meskipun rotasi otomatis dinonaktifkan. Mengetuk tombol ini secara efektif menetapkan preferensi
rotasi pengguna (Settings.System.USER_ROTATION
). WindowManager menggunakan preferensi
ini, bersama dengan detail lain tentang Aktivitas teratas dan status sistem,
untuk mengubah rotasi sistem. WindowManager terus menggunakan preferensi rotasi
pengguna saat menentukan rotasi yang akan merender sistem saat berpindah ke
Aktivitas lain.

Preferensi rotasi pengguna harus dipertahankan saat berpindah antar-Aktivitas. Namun, karena sebagian besar pengguna ponsel hanya ingin menggunakan mode lanskap dalam jangka waktu singkat dan sementara, kami menambahkan bias orientasi natural. Preferensi rotasi pengguna direset ke orientasi alami perangkat setiap kali rotasi sistem berubah ke orientasi alami perangkat. Untuk sebagian besar ponsel, orientasi alami perangkat adalah potret (0º). Mereset preferensi rotasi pengguna sering terjadi saat menggunakan aplikasi khusus potret, mengunci ponsel, atau kembali ke ruang kerja peluncur.
Interaksi rotasi untuk pengguna tidak banyak berubah dalam satu dekade terakhir. Pengguna mungkin merasa sulit menemukan fitur ini mengingat histori mereka sebelumnya dengan rotasi dan posisi tombol di menu navigasi. Oleh karena itu, kami telah menambahkan mode pengantar ke tombol putar yang menandainya saat muncul. Perilaku mode pengantar hanya terjadi untuk beberapa interaksi tombol pertama, setelah itu mode pengantar dinonaktifkan.
Sumber
Dukungan untuk saran rotasi telah ditambahkan ke Android 9. Sebagian besar perubahan terdapat dalam file berikut.
services/.../server/policy/PhoneWindowManager.java
:- Hook yang menggunakan output
WindowOrientationListener
(MyOrientationListener
, bertanggung jawab untuk memantau sensor guna menentukan apakah perangkat telah diputar) - Mempertahankan
WindowOrientationListener
aktif meskipun rotasi otomatis dinonaktifkan (lihatneedSensorRunningLp()
) - Menghitung rotasi sistem berdasarkan preferensi rotasi pengguna, setelan
screenOrientation
Aktivitas teratas, dan status sistem (lihatrotationForOrientationLw()
) - Menentukan apakah Aktivitas atas dapat diputar ke rotasi tertentu (lihat
isRotationChoicePossible()
)
- Hook yang menggunakan output
SystemUI/.../statusbar/phone/NavigationBarFragment
:- Menentukan apakah tombol menu navigasi harus ditampilkan pada callback
saran rotasi dari
PhoneWindowManager
(lihatonRotationProposal()
) - Menangani kapan harus menyembunyikan tombol menu navigasi putar (lihat panggilan ke
setRotateSuggestionButtonState(false)
) - Menangani waktu tunggu tombol, termasuk kasus khusus saat navbar disembunyikan (biasanya dalam layar penuh)
- Mereset preferensi pengguna saat kembali ke orientasi alami
perangkat (
mRotationWatcher
) - Memilih gaya yang sesuai untuk animasi tombol menu navigasi,
yang diterapkan di
NavigationBarView
(lihatonRotationProposal()
) - Menambahkan logika mode pengantar, termasuk animasi khusus
(lihat referensi ke
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
) - Menerapkan flag rotasi disable2 (lihat
disable()
)
- Menentukan apakah tombol menu navigasi harus ditampilkan pada callback
saran rotasi dari
SystemUI/.../statusbar/phone/NavigationBarView.java
:- Animasi ikon tombol gaya agar sesuai dengan rotasi yang tertunda (lihat
updateRotateSuggestionButtonStyle()
) - Menangani perubahan visibilitas tombol (lihat
setRotateButtonVisibility()
), termasuk logika untuk menyembunyikan tombol putar jika layanan Aksesibilitas tertentu aktif (mempertimbangkan peringkat stack tombol menu samping paling kanan)
- Animasi ikon tombol gaya agar sesuai dengan rotasi yang tertunda (lihat
SystemUI/res/layout/menu_ime.xml
:- Mencakup
KeyButtonView
baru untuk tombol putar, yang ditumpuk di atas menu dan pemilih IME/keyboard, tetapi di bawah tombol Aksesibilitas
- Mencakup
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:AnimatedVectorDrawable
kompleks yang digunakan untuk menganimasikan tombol menu navigasi putar- Gaya visual (di
SystemUI/res/values/styles.xml
) digunakan untuk menetapkan sudut awal dan akhir rotasi sehingga drawable yang sama dapat digunakan untuk menganimasikan berbagai rotasi awal dan akhir - Tinta ikon ditetapkan melalui
TintedKeyButtonDrawable
Implementasi
Android 9 menyertakan semua perubahan yang diperlukan agar saran rotasi berfungsi untuk perangkat yang menggunakan tombol navigasi software (kembali, layar utama, dll.).
Produsen perangkat yang membuat perangkat dengan tombol navigasi hardware yang ingin menerapkan fitur ini harus mendesain dan menerapkan affordance UI Sistem mereka sendiri atau menonaktifkan fitur tersebut. Sebaiknya platform yang diperkenalkan mudah digunakan saat perangkat dipegang pada 90º atau 180º terhadap rotasi sistem saat ini dan dapat diakses dengan cepat. Oleh karena itu, penggunaan notifikasi (seperti yang dilakukan untuk pemilih IME/keyboard) tidak direkomendasikan.
Persyaratan hardware untuk menggunakan fitur ini sama dengan persyaratan untuk menggunakan putar otomatis.
Untuk konsistensi penerapan, preferensi rotasi pengguna
(Settings.System.USER_ROTATION
) harus direset ke rotasi alami
perangkat saat sistem berubah ke rotasi alami perangkat karena alasan apa pun
saat putar otomatis dinonaktifkan. Penerapan yang disediakan akan melakukannya (lihat
NavigationBarFragment.mRotationWatcher
).
Ada tanda baru di StatusBarManager.disable2
untuk sementara mencegah
saran rotasi muncul. Lihat
StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
. Flag ini harus
dipatuhi dalam semua implementasi karena digunakan oleh aplikasi sistem penting, termasuk
Wizard Penyiapan. Implementasi yang disediakan mendukung hal ini (lihat
NavigationBarFragment.disable()
).
Sebaiknya aktifkan fitur ini dan ikuti penerapan AOSP, jika memungkinkan. Kami ingin pengalaman rotasi tetap serupa di antara perangkat, yang mencerminkan keseragaman pengalaman di sebagian besar ponsel saat ini antara putar otomatis dan kunci potret.
Penyesuaian
Karena saran rotasi hanya muncul dalam mode rotasi terkunci (rotasi otomatis nonaktif),
Anda dapat memilih apakah fitur tersebut diaktifkan secara default untuk penginstalan baru dengan
memilih untuk menonaktifkan rotasi otomatis secara default. Lihat
def_accelerometer_rotation
di
SettingsProvider/res/values/defaults.xml
untuk membuat perubahan default.
Pengguna dapat dengan mudah mengubah apakah putar otomatis aktif atau tidak (terlepas dari setelan default) melalui kartu putar di Setelan cepat atau Setelan tampilan.
Validasi
Untuk pengujian, fitur ini dapat dinonaktifkan dan diaktifkan dengan mengubah nilai Settings.Secure
pembatasan. Hal ini paling mudah dilakukan dengan menjalankan
perintah berikut dari instance adb dengan hak istimewa:
adb shell settings put secure show_rotation_suggestions <x>
Tetapkan x ke 0
untuk nonaktif dan 1
untuk aktif.
Untuk pengujian, mode pengantar dapat direset dengan mengubah nilai
Settings.Secure
terkait. Hal ini paling mudah dilakukan dengan menjalankan
perintah berikut dari instance adb dengan hak istimewa:
adb shell settings put secure num_rotation_suggestions_accepted 0