Trong Android 8.0, người dùng có thể chuyển đổi giữa chế độ tự động xoay và chế độ xoay dọc bằng cách sử dụng thẻ Cài đặt nhanh hoặc phần Cài đặt màn hình. Trong Android 9, chúng tôi đã cập nhật chế độ xoay dọc để loại bỏ các thao tác xoay ngoài ý muốn bằng cách ghim chế độ xoay màn hình hiện tại ngay cả khi vị trí thiết bị thay đổi. Người dùng có thể kích hoạt tính năng xoay theo cách thủ công khi cần bằng cách nhấn vào một nút mới trong thanh điều hướng. Chúng tôi đã đổi tên chế độ dọc thành khoá xoay và chế độ này sẽ kích hoạt khi chế độ tự động xoay tắt. Không có thay đổi nào đối với chế độ tự động xoay.
Khi thiết bị ở chế độ khoá xoay, người dùng có thể khoá màn hình theo bất kỳ hướng xoay nào được Hoạt động hiển thị ở trên cùng hỗ trợ (theo các quy tắc ràng buộc hiện tại của hệ thống). Nếu Hoạt động trên cùng có thể hiển thị ở nhiều chế độ xoay trong chế độ tự động xoay, thì các tuỳ chọn tương tự phải có trong chế độ khoá xoay, ngoại trừ một số trường hợp ngoại lệ dựa trên chế độ cài đặt screenOrientation
của Hoạt động.
Chế độ khoá xoay hoạt động bằng cách hiển thị một nút trong thanh điều hướng khi thay đổi chế độ xoay thiết bị. Để thực hiện việc này, cảm biến hướng của thiết bị phải luôn hoạt động ngay cả khi chế độ tự động xoay đang tắt. Thao tác nhấn vào nút này sẽ đặt hiệu quả tuỳ chọn xoay của người dùng (Settings.System.USER_ROTATION
). WindowManager sử dụng tuỳ chọn này cùng với các thông tin chi tiết khác về Hoạt động hàng đầu và trạng thái hệ thống để thay đổi chế độ xoay của hệ thống. WindowManager tiếp tục sử dụng tuỳ chọn xoay của người dùng khi quyết định chế độ xoay để hiển thị hệ thống khi chuyển sang một Hoạt động khác.

Bạn phải duy trì lựa chọn ưu tiên xoay của người dùng khi di chuyển giữa các Hoạt động. Tuy nhiên, vì hầu hết người dùng điện thoại chỉ muốn ở chế độ ngang trong một khoảng thời gian ngắn và tạm thời, nên chúng tôi đã thêm độ lệch hướng tự nhiên. Lựa chọn ưu tiên về độ xoay của người dùng sẽ được đặt lại về hướng tự nhiên của thiết bị bất cứ khi nào độ xoay của hệ thống thay đổi thành hướng tự nhiên của thiết bị. Đối với hầu hết điện thoại, hướng tự nhiên của thiết bị là hướng dọc (0º). Việc đặt lại lựa chọn ưu tiên xoay của người dùng thường xảy ra khi sử dụng ứng dụng chỉ có chế độ dọc, khoá điện thoại hoặc quay lại không gian làm việc của trình chạy.
Các lượt tương tác xoay cho người dùng không thay đổi nhiều trong thập kỷ qua. Người dùng có thể khó khám phá tính năng này do trước đây họ đã xoay và định vị nút trong thanh điều hướng. Vì lý do này, chúng tôi đã thêm một chế độ giới thiệu vào nút xoay để làm nổi bật nút này khi nó xuất hiện. Hành vi của chế độ giới thiệu chỉ xảy ra trong vài lượt tương tác với nút đầu tiên, sau đó chế độ giới thiệu sẽ bị tắt.
Nguồn
Thêm tính năng hỗ trợ đề xuất xoay vào Android 9. Hầu hết các thay đổi đều nằm trong các tệp sau.
services/.../server/policy/PhoneWindowManager.java
:- Các móc sử dụng đầu ra của
WindowOrientationListener
(MyOrientationListener
, chịu trách nhiệm theo dõi các cảm biến để xác định xem thiết bị có được xoay hay không) - Giữ cho
WindowOrientationListener
hoạt động ngay cả khi chế độ tự động xoay bị tắt (xemneedSensorRunningLp()
) - Tính toán chế độ xoay hệ thống theo lựa chọn ưu tiên xoay của người dùng, chế độ cài đặt
screenOrientation
Hoạt động hàng đầu và trạng thái hệ thống (xemrotationForOrientationLw()
) - Xác định xem Hoạt động trên cùng có thể xoay theo một góc xoay nhất định hay không (xem
isRotationChoicePossible()
)
- Các móc sử dụng đầu ra của
SystemUI/.../statusbar/phone/NavigationBarFragment
:- Xác định xem nút thanh điều hướng có hiển thị trên các lệnh gọi lại đề xuất xoay từ
PhoneWindowManager
hay không (xemonRotationProposal()
) - Xử lý thời điểm ẩn nút thanh điều hướng xoay (xem các lệnh gọi đến
setRotateSuggestionButtonState(false)
) - Xử lý thời gian chờ của nút, bao gồm cả trường hợp đặc biệt khi thanh điều hướng bị ẩn (thường ở chế độ toàn màn hình)
- Đặt lại lựa chọn ưu tiên của người dùng khi quay lại hướng tự nhiên của thiết bị (
mRotationWatcher
) - Chọn kiểu phù hợp cho ảnh động nút thanh điều hướng, được áp dụng trong
NavigationBarView
(xemonRotationProposal()
) - Thêm logic chế độ giới thiệu, bao gồm cả ảnh động chuyên biệt (xem nội dung tham khảo về
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
) - Triển khai cờ xoay disable2 (xem
disable()
)
- Xác định xem nút thanh điều hướng có hiển thị trên các lệnh gọi lại đề xuất xoay từ
SystemUI/.../statusbar/phone/NavigationBarView.java
:- Ảnh động biểu tượng nút Kiểu để khớp với chế độ xoay đang chờ xử lý (xem
updateRotateSuggestionButtonStyle()
) - Xử lý các thay đổi về chế độ hiển thị nút (xem
setRotateButtonVisibility()
), bao gồm cả logic để ẩn nút xoay nếu một số dịch vụ Hỗ trợ tiếp cận đang hoạt động (có tính đến thứ hạng ngăn xếp nút thanh điều hướng ở ngoài cùng bên phải)
- Ảnh động biểu tượng nút Kiểu để khớp với chế độ xoay đang chờ xử lý (xem
SystemUI/res/layout/menu_ime.xml
:- Bao gồm một
KeyButtonView
mới cho nút xoay, xếp chồng lên trình đơn và bộ chọn IME/bàn phím nhưng bên dưới nút Hỗ trợ tiếp cận
- Bao gồm một
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:AnimatedVectorDrawable
phức tạp dùng để tạo ảnh động cho nút thanh điều hướng xoay- Kiểu (trong
SystemUI/res/values/styles.xml
) được dùng để đặt góc bắt đầu và kết thúc xoay để có thể sử dụng cùng một đối tượng có thể vẽ để tạo ảnh động cho nhiều góc xoay bắt đầu và kết thúc - Tính năng phủ màu biểu tượng được đặt thông qua
TintedKeyButtonDrawable
Triển khai
Android 9 bao gồm tất cả các thay đổi cần thiết để các đề xuất xoay hoạt động trên các thiết bị sử dụng các phím điều hướng bằng phần mềm (quay lại, màn hình chính, v.v.).
Những nhà sản xuất thiết bị tạo thiết bị có các phím điều hướng phần cứng và muốn triển khai tính năng này sẽ cần thiết kế và triển khai tính năng hỗ trợ Giao diện người dùng hệ thống của riêng họ hoặc tắt tính năng này. Bạn nên thiết kế mọi giao diện được giới thiệu sao cho dễ sử dụng khi thiết bị được giữ ở góc 90º hoặc 180º so với chế độ xoay hệ thống hiện tại và có thể truy cập nhanh chóng. Vì những lý do này, bạn không nên sử dụng thông báo (như đã thực hiện cho bộ chọn IME/bàn phím).
Yêu cầu về phần cứng để sử dụng tính năng này giống với yêu cầu để sử dụng tính năng tự động xoay.
Để đảm bảo tính nhất quán trong quá trình triển khai, bạn cần đặt lại tuỳ chọn ưu tiên xoay của người dùng (Settings.System.USER_ROTATION
) về chế độ xoay tự nhiên của thiết bị khi hệ thống thay đổi thành chế độ xoay tự nhiên của thiết bị vì bất kỳ lý do gì khi chế độ tự động xoay đang tắt. Phương thức triển khai được cung cấp sẽ thực hiện việc này (xem NavigationBarFragment.mRotationWatcher
).
Có một cờ mới trong StatusBarManager.disable2
để tạm thời ngăn các đề xuất xoay xuất hiện. Xem StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
. Bạn phải tuân thủ cờ này trong mọi hoạt động triển khai vì cờ này được các ứng dụng hệ thống quan trọng sử dụng, bao gồm cả Trình hướng dẫn thiết lập. Cách triển khai được cung cấp hỗ trợ việc này (xem NavigationBarFragment.disable()
).
Bạn nên bật tính năng này và làm theo cách triển khai AOSP nếu có thể. Chúng tôi muốn giữ cho trải nghiệm xoay tương tự nhau giữa các thiết bị, phản ánh sự đồng nhất trong trải nghiệm trên hầu hết các điện thoại hiện nay giữa chế độ tự động xoay và khoá dọc.
Tuỳ chỉnh
Vì các đề xuất xoay chỉ xuất hiện ở chế độ khoá xoay (tắt chế độ tự động xoay), nên bạn có thể chọn bật tính năng này theo mặc định cho các lượt cài đặt mới bằng cách chọn tắt chế độ tự động xoay theo mặc định. Xem def_accelerometer_rotation
trong SettingsProvider/res/values/defaults.xml
để thực hiện các thay đổi mặc định.
Người dùng có thể dễ dàng thay đổi chế độ tự động xoay (bất kể chế độ mặc định) thông qua ô xoay trong phần Cài đặt nhanh hoặc Cài đặt màn hình.
Xác nhận kết quả
Để kiểm thử, bạn có thể bật và tắt tính năng này bằng cách thay đổi giá trị Settings.Secure
của bộ lọc. Bạn có thể thực hiện việc này dễ dàng nhất bằng cách chạy lệnh sau từ một thực thể adb đặc quyền:
adb shell settings put secure show_rotation_suggestions <x>
Đặt x thành 0
để tắt và 1
để bật.
Để kiểm thử, bạn có thể đặt lại chế độ giới thiệu bằng cách thay đổi giá trị Settings.Secure
liên kết. Bạn có thể thực hiện việc này dễ dàng nhất bằng cách chạy lệnh sau từ một thực thể adb đặc quyền:
adb shell settings put secure num_rotation_suggestions_accepted 0