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

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

Lưu ý: Hướng dẫn này chủ yếu đề cập đến cách xử lý phương thức nhập dữ liệu xoay qua giao diện người dùng dựa trên Thành phần hiển thị. Để biết thêm thông tin về cách xử lý phương thức nhập dữ liệu xoay qua Compose cho Wear OS, hãy xem phần Phương thức nhập dữ liệu xoay trên Compose.

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 nếu chúng có tiêu điểm mà không cần phải có đoạn mã cụ thể cho Wear OS. 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. Các sự kiện nhập dữ liệu xoay không làm bật lên 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 qua View.onGenericMotionEvent() thì sự kiện sẽ được gửi đến Activity.onGenericMotionEvent().

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:

  • Hãy lưu ý rằng, 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 được 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".
  • 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 chế độ xem cuộn này.
  • 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 nút xoay bên hông hỗ trợ.
  • Nếu giao diện người dùng của bạn chứa một số chế độ xem khác lấy tiêu điểm khi người dùng tương tác (ví dụ: InputText), hãy cung cấp cho người dùng cách để khôi phục tiêu điểm về chế độ xem cuộn nếu chế độ xem này bị mất tiêu điểm bằng cách nghe thao tác 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ể tự 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. Mở ứ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 Android 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 bằng Android Studio.
  4. Nhấp vào nút ba dấu chấm của trình đơn mục bổ sung ở 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: