Xoay vòng đề xuất

Trong Android 8.0, người dùng có thể chuyển đổi giữa chế độ tự động xoay và xoay dọc chế độ đó bằng ô Quicksettings 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 không chủ ý bằng cách ghim xoay màn hình hiện tại ngay cả khi vị trí của thiết bị thay đổi. Người dùng có thể kích hoạt xoay theo cách thủ công khi cần bằng cách nhấn một nút mới trong thanh điều hướng. Chúng tôi đã đổi tên chế độ chân dung thành khoá xoay và chế độ này sẽ kích hoạt khi tự động xoay đã bị 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 ở bất kỳ chế độ nào chế độ xoay được hỗ trợ bởi Activity (Hoạt động trên cùng) hiển thị (theo hệ thống hiện tại) hạn chế). Nếu Hoạt động trên cùng có thể hiển thị theo nhiều vòng xoay trong chế độ tự động xoay, các tuỳ chọn tương tự sẽ có sẵn ở chế độ khoá xoay, với một số ngoại lệ dựa trên screenOrientation của Hoạt động cài đặt.

Chế độ khoá xoay hoạt động bằng cách hiển thị một nút trong thanh điều hướng khi xoay thiết bị thay đổi. Để thực hiện việc này, cảm biến hướng của thiết bị phải duy trì trạng thái 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ẽ thiết lập chế độ xoay người dùng một cách hiệu quả tùy chọn (Settings.System.USER_ROTATION). WindowManager sử dụng tùy chọn, 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 hướng xoay của hệ thống. WindowManager tiếp tục sử dụng chế độ xoay người dùng lựa chọn ưu tiên khi quyết định chế độ xoay nào sẽ kết xuất hệ thống khi di chuyển sang một Hoạt động khác.

Ảnh GIF này cho thấy một chiếc điện thoại theo 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 xem người dùng có muốn
       thay đổi hướng màn hình thành hướng ngang.
Hình 1. Nút đề xuất xoay bằng cử chỉ "Vuốt nút mũi tên lên trên" đã bật cử chỉ

Bạn nên duy trì lựa chọn ưu tiên về xoay vòng 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, trong một khoảng thời gian tạm thời, chúng tôi đã bổ sung thêm yếu tố định hướng tự nhiên. Xoay người dùng lựa chọn ưu tiên là reset về hướng tự nhiên của thiết bị bất cứ khi nào xoay hệ thống sẽ thay đổi thành hướng tự nhiên của thiết bị. Đối với hầu hết các loại điện thoại, hướng tự nhiên của thiết bị là hướng dọc (0o). Đang đặt lại chế độ xoay vòng người dùng lựa chọn ưu tiên thường xảy ra khi dùng ứng dụng chỉ hiển thị theo hướng 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.

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

Nguồn

Đã thêm hỗ trợ cho đề xuất xoay Android 9. Hầu hết các thay đổi đều có trong các tệp sau đây.

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

Triển khai

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

Các nhà sản xuất thiết bị tạo ra thiết bị có phím điều hướng phần cứng để triển khai tính năng này sẽ cần thiết kế và triển khai Giao diện người dùng hệ thống riêng tương tác hoặc tắt tính năng này. Chúng tôi khuyến khích mọi nền tảng được giới thiệu dễ sử dụng khi giữ thiết bị ở góc 90o hoặc 180o so với hệ thống hiện tại và có thể truy cập nhanh chóng. Vì những lý do này, việc sử dụng thông báo Bạn không nên sử dụng (như cách làm cho IME/bộ chọn 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 chế độ tự động xoay.

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

Bạn nên bật tính năng này và làm theo AOSP (Dự án nguồn mở Android) nếu có thể. Chúng tôi cố gắng giữ cho trải nghiệm xoay vòng tương tự giữa các thiết bị, phản ánh tính đồng nhất về trải nghiệm trên hầu hết điện thoại hiện nay giữa chế độ khoá tự động xoay và khoá chế độ dọc.

Tuỳ chỉnh

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

Để thử nghiệm, bạn có thể bật và tắt tính năng này bằng cách thay đổi một cổng Giá trị Settings.Secure. Điều này dễ dàng nhất được thực hiện bằng cách chạy sau đây 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 để tắt và 1 để bật.

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

adb shell settings put secure num_rotation_suggestions_accepted 0