Phương thức nhập dữ liệu xoay

Stay organized with collections Save and categorize content based on your preferences.

Một số thiết bị Wear OS có nút thực xoay phía bên hông. Khi người dùng vặn nút, chế độ xem hiện tại của ứng dụng sẽ cuộn lên hoặc xuống. Loại đầu vào này được gọi là phương thức nhập dữ liệu xoay.

Nhiều vùng chứa có thể cuộn, chẳng hạn như ScrollView, ListView, HorizontalScrollViewWearableRecyclerView hỗ trợ phương thức nhập dữ liệu xoay mà không cần phải có mã cụ thể cho Wear OS, nếu các vùng chứa này có tiêu điểm. Có tiêu điểm là một điều kiện tiên quyết quan trọng vì trên Android 9 (API cấp 28) trở lên, các chế độ xem hoàn toàn không nhận được tiêu điểm.

Các phương pháp hay nhất về tiêu điểm

Để phản hồi các sự kiện nhập dữ liệu xoay, vùng chứa có thể cuộn phải có tiêu điểm. Dưới đây là các phương pháp hay nhất để phản hồi sự kiện nhập dữ liệu xoay:

  • Theo mặc định, việc chạy một hoạt động hoặc thậm chí là nhấn vào một chế độ xem không tạo ra tiêu điểm, ngay cả khi hoạt động đó có thể là tâm điểm. Để lấy tiêu điểm cho chế độ xem của bạn, chế độ xem phải sử dụng thẻ <requestFocus /> hoặc gọi View.requestFocus() theo cách thủ công.
  • Đánh dấu các chế độ xem cuộn tuỳ chỉnh dưới dạng thành phần có thể lấy tiêu điểm bằng cách sử dụng cả android:focusable="true"android:focusableInTouchMode="true".
  • Sự kiện nhập dữ liệu xoay chỉ được gửi đến chế độ xem tập trung (lấy tiêu điểm). Các sự kiện này không tạo chuỗi bọt (bong bóng) hệ phân cấp chế độ xem. Nếu không có chế độ xem tập trung hoặc nếu chế độ xem tập trung trả về false từ View.onGenericMotionEvent(), thì sự kiện đó sẽ được gửi đến Activity.onGenericMotionEvent().
  • Nếu chế độ xem cuộn được đính kèm sau Activity.onCreate() (ví dụ: đợi một yêu cầu mạng kết thúc trước khi xây dựng giao diện người dùng), hãy gọi requestFocus() sau khi đính kèm.
  • Nếu chế độ xem cuộn ban đầu là INVISIBLE hoặc GONE, hãy gọi requestFocus() khi bạn đặt thành VISIBLE.
  • Nếu hoạt động có nhiều chế độ xem cuộn, hãy chọn một thành phần để tập trung (lấy tiêu điểm) thông qua thẻ <requestFocus />. Tính năng cuộn lồng nhau không được hỗ trợ với nút xoay bên hông.
  • Nếu giao diện người dùng của bạn chứa một số chế độ xem tập trung khác khi người dùng tương tác với chế độ xem đó (ví dụ: InputText), hãy cung cấp cho người dùng một số cách để khôi phục tiêu điểm về chế độ xem cuộn nếu người dùng mất tiêu điểm. Bạn có thể thực hiện việc này bằng cách nhấn vào chế độ xem cuộn và gọi requestFocus() để phản hồi.

Hành vi xoay tuỳ chỉnh

Nếu chế độ xem cuộn không hỗ trợ thao tác cuộn phương thức nhập dữ liệu xoay, hoặc nếu bạn muốn sử dụng phương thức nhập dữ liệu xoay cho thao tác khác thay vì cuộn (ví dụ: phóng to/thu nhỏ hoặc quay số), bạn có thể xử lý các sự kiện cuộn. Hãy nhớ đảm bảo chế độ xem của bạn lấy được tiêu điểm. Nếu không, các sự kiện sẽ không diễn ra.

Đoạn mã sau đây cho biết cách sử dụng MotionEvent, InputDeviceCompat, và ViewConfigurationCompat để thêm tính năng cuộn tuỳ chỉnh vào chế độ xem của bạn:

Kotlin

myView.setOnGenericMotionListener { v, ev ->
  if (ev.action == MotionEvent.ACTION_SCROLL &&
      ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
  ) {
    // Don't forget the negation here
    val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
        ViewConfigurationCompat.getScaledVerticalScrollFactor(
             ViewConfiguration.get(context), context
        )
    // Swap these axes to scroll horizontally instead
    v.scrollBy(0, delta.roundToInt())
    true
  } else {
    false
  }
}

Java

myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
  @Override
  public boolean onGenericMotion(View v, MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_SCROLL &&
        ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
    ) {
      // Don't forget the negation here
      float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
          ViewConfigurationCompat.getScaledVerticalScrollFactor(
               ViewConfiguration.get(context), context
          );

      // Swap these axes to scroll horizontally instead
      v.scrollBy(0, Math.round(delta));

      return true;
    }
    return false;
  }
});

Thử nghiệm bằng trình mô phỏng

Sử dụng Trình mô phỏng Android để mô phỏng thao tác cuộn phương thức nhập dữ liệu xoay trên thiết bị Wear. Chạy ứng dụng Wear trên trình mô phỏng để chạy dự án, hoặc kéo tệp APK vào trình mô phỏng để cài đặt.

Cách kiểm thử phương thức nhập dữ liệu xoay trên trình mô phỏng:

  1. Từ Trình quản lý SDK, hãy sử dụng thẻ Bộ công cụ SDK để tải Trình mô phỏng Android 26.0.3 trở lên.
  2. Trong Studio, hãy chọn Tools > Android > AVD Manager (Công cụ > Android > Trình quản lý thiết bị ảo Android). Tạo thiết bị Wear mới bằng API 25 trở lên.
  3. Chạy trình mô phỏng trong Android Studio.
  4. Nhấp vào nút mục bổ sung (ba dấu chấm ở cuối thanh công cụ của trình mô phỏng). Nhấp vào thẻ Phương thức nhập dữ liệu xoay trong cửa sổ mới để mở giao diện nhập dữ liệu xoay và thử cuộn phương thức nhập dữ liệu xoay.

Video sau đây cho thấy phương thức nhập dữ liệu xoay trong trình mô phỏng: