Xoay vòng đề xuất

Trong Android 8.0, người dùng có thể chuyển đổi giữa chế độ xoay tự động và xoay dọc bằng cách sử dụng ô Cài đặt nhanh hoặc cài đặt Hiển thị. 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 xoay thủ công khi cần bằng cách nhấn nút mới trên thanh điều hướng. Chúng tôi đã đổi tên chế độ dọc thành khóa xoay và nó sẽ kích hoạt khi tắt tính năng tự động xoay. Không có thay đổi nào đối với chế độ tự động xoay.

Khi thiết bị ở chế độ khóa xoay, người dùng có thể khóa màn hình của họ theo bất kỳ chế độ xoay nào được hỗ trợ bởi Hoạt động hiển thị ở trên cùng (với các ràng buộc của hệ thống hiện tại). Nếu Hoạt động trên cùng có thể được hiển thị theo nhiều cách xoay ở chế độ tự động xoay thì các tùy chọn tương tự sẽ có sẵn ở chế độ khóa xoay, với một số ngoại lệ dựa trên cài đặt screenOrientation của Hoạt động.

Chế độ khóa xoay hoạt động bằng cách hiển thị một nút trên thanh điều hướng khi thay đổi góc xoay của thiết bị. Để thực hiện được điều này, cảm biến định hướng của thiết bị phải duy trì hoạt động ngay cả khi tính năng tự động xoay bị tắt. Nhấn vào nút này sẽ đặt tùy chọn xoay người dùng một cách hiệu quả ( Settings.System.USER_ROTATION ). WindowManager sử dụng tùy chọn này cùng với các chi tiết khác về trạng thái hệ thống và Hoạt động hàng đầu để thay đổi chế độ xoay của hệ thống. WindowManager tiếp tục sử dụng tùy chọn xoay vòng của người dùng khi quyết định xoay vòng nào để hiển thị hệ thống khi chuyển sang Hoạt động khác.

Ảnh gif này hiển thị điện thoại ở hướng ngang với màn hình ở hướng dọc. Một biểu tượng xuất hiện để hỏi người dùng xem họ có muốn thay đổi hướng màn hình sang ngang hay không.
Hình 1 . Xoay nút gợi ý khi bật cử chỉ "Vuốt lên trên nút Home"

Tùy chọn xoay vòng người dùng phải được duy trì 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ế độ nằm ngang trong một khoảng thời gian ngắn và tạm thời nên chúng tôi đã thêm xu hướng định hướng tự nhiên. Tùy chọn xoay của người dùng được đặt lại về hướng tự nhiên của thiết bị bất cứ khi nào chế độ xoay của hệ thống thay đổi theo hướng tự nhiên của thiết bị. Đối với hầu hết các điện thoại, hướng tự nhiên của thiết bị là dọc (0°). Việc đặt lại tùy chọn xoay người dùng thường xảy ra khi sử dụng ứng dụng chỉ ở chế độ dọc, khóa điện thoại hoặc quay lại không gian làm việc của trình khởi chạy.

Tương tác xoay vòng dành cho người dùng không thay đổi nhiều trong thập kỷ qua. Người dùng có thể thấy khó khám phá tính năng này do lịch sử trước đây của họ có tính năng xoay và định vị nút trong thanh điều hướng. Vì lý do này, chúng tôi đã thêm chế độ giới thiệu vào nút xoay để làm nổi bật chế độ này khi nó xuất hiện. Hành vi ở chế độ giới thiệu chỉ xảy ra đối với một số lần tương tác nút đầu tiên, sau đó chế độ giới thiệu sẽ bị tắt.

Nguồn

Hỗ trợ đề xuất xoay đã được thêm vào Android 9. Hầu hết các thay đổi đều có trong các tệp sau.

  • services/.../server/policy/PhoneWindowManager.java :
    • Hook tiêu thụ đầu ra của WindowOrientationListener ( MyOrientationListener , chịu trách nhiệm giám sát các cảm biến để xác định xem thiết bị đã được xoay chưa)
    • Giữ WindowOrientationListener hoạt động ngay cả khi tính năng tự động xoay bị tắt (xem needSensorRunningLp() )
    • Tính toán xoay vòng hệ thống theo tùy chọn xoay của người dùng, cài đặt screenOrientation hoạt động trên cùng và trạng thái hệ thống (xem rotationForOrientationLw() )
    • Xác định xem Hoạt động trên cùng có thể xoay theo một vòng quay nhất định hay không (xem isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Xác định xem nút thanh điều hướng có được hiển thị trong các lệnh gọi lại gợi ý xoay từ PhoneWindowManager hay không (xem onRotationProposal() )
    • Xử lý thời điểm ẩn nút xoay thanh điều hướng (xem các lệnh gọi tới 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 tùy chọ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 thích hợp cho hoạt ảnh của nút điều hướng, được áp dụng trong NavigationBarView (xem onRotationProposal() )
    • Thêm logic chế độ giới thiệu, bao gồm hoạt ảnh chuyên dụng (xem tài liệu tham khảo về Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • Triển khai cờ xoay vòng vô hiệu hóa2 (xem disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Tạo kiểu hoạt ảnh cho biểu tượng nút để khớp với chế độ xoay đang chờ xử lý (xem updateRotateSuggestionButtonStyle() )
    • Xử lý các thay đổi về mức độ hiển thị của nút (xem setRotateButtonVisibility() ), bao gồm logic để ẩn nút xoay nếu một số dịch vụ Trợ năng nhất định đang hoạt động (có tính đến xếp hạng ngăn xếp nút điều hướng ngoài cùng bên phải)
  • SystemUI/res/layout/menu_ime.xml :
    • Bao gồm KeyButtonView mới cho nút xoay, được xếp chồng phía trên menu và bộ chọn IME/bàn phím nhưng bên dưới nút Trợ năng
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • AnimatedVectorDrawable phức tạp được sử dụng để tạo hoạt ảnh cho nút xoay thanh điều hướng
    • Kiểu dáng (trong SystemUI/res/values/styles.xml ) được sử dụng để đặt góc bắt đầu và kết thúc của vòng xoay để có thể sử dụng cùng một hình vẽ để tạo hiệu ứng cho các góc quay bắt đầu và kết thúc khác nhau
    • Màu sắc biểu tượng được đặt thông qua TintedKeyButtonDrawable

Thực hiện

Android 9 bao gồm tất cả các thay đổi cần thiết để đề xuất xoay hoạt động cho các thiết bị sử dụng phím điều hướng phần mềm (trở lại, màn hình chính, v.v.).

Các nhà sản xuất thiết bị tạo ra các thiết bị có phím điều hướng phần cứng muốn triển khai tính năng này sẽ cần phải thiết kế và triển khai khả năng chi trả cho 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. Chúng tôi khuyến nghị rằng mọi bề mặt được giới thiệu đều phải dễ sử dụng khi thiết bị được giữ ở góc 90° hoặc 180° so với góc xoay của 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ư được thực hiện đối với 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 cũng giống như yêu cầu để sử dụng tính năng tự động xoay.

Để đảm bảo tính nhất quán trong triển khai, tùy chọn xoay của người dùng ( Settings.System.USER_ROTATION ) phải được đặt lại 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 tính năng tự động xoay bị tắt. Việc triển khai được cung cấp sẽ thực hiện điều 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 vòng xuất hiện. Xem StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Cờ này phải được tôn trọng trong mọi hoạt động triển khai vì nó được sử dụng bởi các ứng dụng hệ thống quan trọng, bao gồm cả Trình hướng dẫn cài đặt. Việc triển khai được cung cấp hỗ trợ điều này (xem NavigationBarFragment.disable() ).

Chúng tôi thực sự khuyên bạn nên bật tính năng này và tuân theo quá trình triển khai AOSP nếu có thể. Chúng tôi mong muốn duy trì trải nghiệm xoay tương tự giữa các thiết bị, phản ánh sự đồng nhất về trải nghiệm trên hầu hết các điện thoại hiện nay giữa tính năng tự động xoay và khóa dọc.

Tùy chỉnh

Vì đề xuất xoay chỉ xuất hiện ở chế độ khóa xoay (tắt tự động xoay), nên bạn có thể chọn xem tính năng này có được bật mặc định cho các bản cài đặt mới hay không bằng cách chọn tắt 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 xem tính năng tự động xoay có hoạt động hay không (bất kể mặc định) thông qua ô xoay trong Cài đặt nhanh hoặc Cài đặt hiển thị.

Thẩm định

Để thử nghiệm, tính năng này có thể được tắt và bật bằng cách thay đổi giá trị Cài Settings.Secure . Điều này được thực hiện dễ dàng nhất bằng cách chạy lệnh sau từ một phiên bản adb đặc quyền:

adb shell settings put secure show_rotation_suggestions <x>

Đặt x thành 0 cho tắt và 1 cho bật.

Để thử nghiệm, chế độ giới thiệu có thể được đặt lại bằng cách thay đổi giá trị Settings.Secure liên quan. Điều này được thực hiện dễ dàng nhất bằng cách chạy lệnh sau từ một phiên bản adb đặc quyền:

adb shell settings put secure num_rotation_suggestions_accepted 0