Sử dụng cử chỉ cổ tay trên Wear

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

Các cử chỉ cổ tay có thể cho phép bạn tương tác nhanh chóng bằng một tay với ứng dụng khi không tiện dùng màn hình cảm ứng.

Ví dụ: người dùng có thể cuộn qua các thông báo bằng một tay trong khi vẫn cầm một cốc nước bằng tay khác. Các ví dụ cho thấy việc sử dụng cử chỉ cổ tay cũng bao gồm:

  • Trong một ứng dụng để chạy bộ, ban có thể thao tác di chuyển qua các màn hình dọc hiển thị số bước đã đi, thời gian đã đi và tốc độ hiện tại
  • Khi phải mang vác hành lý ở sân bay, bạn có thể cuộn qua để xem thông tin chuyến bay và cổng bay
  • Di chuyển qua các bài báo

Để xem các cử chỉ cổ tay trên đồng hồ của bạn, hãy xác nhận là bạn đã bật cử chỉ bằng cách chọn Cài đặt > Cử chỉ > Cử chỉ cổ tay. Sau đó, hãy hoàn thành phần hướng dẫn về Cử chỉ trên đồng hồ (Cài đặt > Cử chỉ > Mở hướng dẫn).

Cử chỉ sau đây từ trang Trợ giúp Wear OS không dùng được cho các ứng dụng:

  • Lắc cổ tay

Bạn có thể dùng cử chỉ cổ tay theo các cách sau:

Mỗi cử chỉ cổ tay được liên kết với một hằng số int từ lớp KeyEvent, như minh hoạ trong bảng sau:

Cử chỉ sự kiện phím Mô tả
Xoay cổ tay ra ngoài KEYCODE_NAVIGATE_NEXT Mã phím này sẽ được chuyển sang mục tiếp theo.
Xoay cổ tay vào trong KEYCODE_NAVIGATE_PREVIOUS Mã phím này sẽ chuyển sang mục trước.

Sử dụng bố cục cong để hỗ trợ cử chỉ cổ tay

Lớp WearableRecyclerView cung cấp bố cục cong cho các danh sách và tự động hỗ trợ các cử chỉ cổ tay. Lớp này có các hành động được xác định trước cho các lần xuất hiện cử chỉ cổ tay khi Chế độ xem có tiêu điểm. Để biết thông tin về cách sử dụng lớp WearableRecyclerView, hãy xem phần Tạo danh sách. Ngoài ra, hãy xem Các phương pháp hay nhất.

Lưu ý: Lớp WearableRecyclerView thay thế cho một lớp tương tự không còn được dùng nữa trong Thư viện hỗ trợ thiết bị đeo.

Ngay cả khi sử dụng WearableRecyclerView, bạn vẫn nên sử dụng các hằng số từ lớp KeyEvent. Bạn có thể ghi đè các hành động được xác định trước bằng cách phân lớp con WearableRecyclerView và triển khai lại lệnh gọi lại onKeyDown(). Bạn có thể tắt hoàn toàn hành vi này bằng cách sử dụng setEnableGestureNavigation(false). Ngoài ra, hãy xem nội dung Xử lý thao tác trên bàn phím.

Trực tiếp sử dụng các sự kiện phím

Bạn có thể sử dụng các sự kiện phím bên ngoài WearableRecyclerView nhằm kích hoạt hành động mới để phản hồi các sự kiện cử chỉ. Quan trọng là những sự kiện cử chỉ sau:

  • Được nhận dạng khi thiết bị ở Chế độ hoạt động
  • Được phân phối theo cách tương tự như mọi sự kiện phím khác

Cụ thể, những sự kiện này sẽ được chuyển đến Hoạt động trên cùng, đến Chế độ xem (View) có tiêu điểm bàn phím. Cũng giống như mọi sự kiện phím khác, một lớp liên quan đến hoạt động tương tác của người dùng (chẳng hạn như Chế độ xem hoặc Hoạt động) triển khai KeyEvent.Callback có thể nghe các sự kiện phím liên quan đến cử chỉ cổ tay. Khung Android gọi Chế độ xem hoặc Hoạt động tập trung vào các sự kiện phím; đối với các cử chỉ, lệnh gọi lại phương thức onKeyDown() sẽ được gọi khi người dùng thao tác một cử chỉ.

Ví dụ: ứng dụng có thể ghi đè các hành động được xác định trước trong một Chế độ xem hoặc Hoạt động (cả hai đều triển khai KeyEvent.Callback) như sau:

Kotlin

class GesturesActivity : Activity() {

    /* KeyEvent.Callback */
    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_NAVIGATE_NEXT ->
                // Do something that advances a user View to the next item in an ordered list.
                moveToNextItem()
            KeyEvent.KEYCODE_NAVIGATE_PREVIOUS ->
                // Do something that advances a user View to the previous item in an ordered list.
                moveToPreviousItem()
            else -> {
                // If you did not handle it, let it be handled by the next possible element as deemed
                // by the Activity.
                super.onKeyDown(keyCode, event)
            }
        }
    }

    /** Shows the next item in the custom list.  */
    private fun moveToNextItem(): Boolean {
        …
        // Return true if handled successfully, otherwise return false.
        return false
    }

    /** Shows the previous item in the custom list.  */
    private fun moveToPreviousItem(): Boolean {
        …
        // Return true if handled successfully, otherwise return false.
        return false
    }
}

Java

public final class GesturesActivity extends Activity {

 @Override /* KeyEvent.Callback */
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  switch (keyCode) {
   case KeyEvent.KEYCODE_NAVIGATE_NEXT:
    // Do something that advances a user View to the next item in an ordered list.
    return moveToNextItem();
   case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
    // Do something that advances a user View to the previous item in an ordered list.
    return moveToPreviousItem();
  }
  // If you did not handle it, let it be handled by the next possible element as deemed by the Activity.
  return super.onKeyDown(keyCode, event);
 }

 /** Shows the next item in the custom list. */
 private boolean moveToNextItem() {
  boolean handled = false;
  …
  // Return true if handled successfully, otherwise return false.
  return handled;
 }

 /** Shows the previous item in the custom list. */
 private boolean moveToPreviousItem() {
  boolean handled = false;
  …
  // Return true if handled successfully, otherwise return false.
  return handled;
 }
}

Các phương pháp hay nhất

  • Xem lại các trang KeyEvent KeyEvent.Callback để cung cấp các sự kiện phím cho Chế độ xem và Hoạt động của bạn.
  • Duy trì khả năng cung cấp hướng mang tính nhất quán:
    • Sử dụng cử chỉ "Xoay cổ tay ra ngoài" cho thao tác "Tiếp theo", "Xoay cổ tay vào trong" cho thao tác "Trước"
  • Tạo một cử chỉ chạm song song.
  • Cung cấp phản hồi bằng hình ảnh.
  • Không sử dụng mã phím để triển khai chức năng gây phản trực quan đối với phần còn lại của hệ thống. Ví dụ: không sử dụng KEYCODE_NAVIGATE_NEXT để huỷ một thao tác hoặc di chuyển theo trục trái-phải bằng cách xoay cổ tay.
  • Đừng chặn các sự kiện phím trên các phần tử không thuộc giao diện người dùng, ví dụ: các Chế độ xem bị che khuất hoặc bị che khuất một phần. Điều này cũng giống như với mọi sự kiện phím khác.
  • Đừng diễn giải lại các cử chỉ xoay cổ tay liên tục thành cử chỉ mới của riêng bạn. Nó có thể xung đột với cử chỉ "Rung cổ tay" của hệ thống.
  • Để một Chế độ xem nhận được các sự kiện phím cử chỉ thì chế độ xem đó phải có tiêu điểm; hãy xem View::setFocusable(). Vì các cử chỉ được coi là những sự kiện phím, nên các cử chỉ sẽ kích hoạt quá trình chuyển đổi khỏi "Chế độ cảm ứng" có thể thực hiện những việc không mong muốn. Do đó, vì người dùng có thể luân phiên sử dụng giữa cảm ứng và cử chỉ nên phương thức View::setFocusableInTouchmode() có thể cần thiết. Trong một số trường hợp, bạn cũng cần sử dụng setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS) để khi tiêu điểm thay đổi sau khi thay đổi thành hoặc từ "Chế độ cảm ứng", thì Chế độ xem bạn dự định sẽ được lấy tiêu điểm.
  • Hãy dùng requestFocus()clearFocus() một cách thận trọng:
    • Khi gọi requestFocus(), hãy đảm bảo Chế độ xem phải có tiêu điểm. Nếu Chế độ xem nằm ngoài màn hình hoặc bị một Chế độ xem khác che phủ, thì bạn có thể thấy bất ngờ khi các cử chỉ kích hoạt lệnh gọi lại.
    • clearFocus() sẽ bắt đầu một lượt tìm kiếm tiêu điểm để tìm một Chế độ xem phù hợp khác. Tuỳ thuộc vào hệ phân cấp Chế độ xem, lượt tìm kiếm này có thể yêu cầu các phép tính toán không nhỏ. Sau cùng nó còn có thể gán tiêu điểm cho một Chế độ xem mà bạn không mong muốn nhận được tiêu điểm.
  • Trước tiên, các sự kiện phím sẽ được phân phối đến Chế độ xem với tiêu điểm là hệ phân cấp Chế độ xem. Nếu Chế độ xem tập trung không xử lý sự kiện (nghĩa là trả về false), thì sự kiện đó sẽ không được gửi đến Chế độ xem gốc, ngay cả khi chế độ này có thể nhận tiêu điểm và có KeyListener. Thay vào đó, sự kiện này được phân phối đến Hoạt động hiện tại có tiêu điểm là Hệ phân cấp chế độ xem. Do đó, bạn có thể cần phải nắm rõ mọi sự kiện ở cấp cao hơn rồi truyền các mã liên quan xuống. Ngoài ra, bạn có thể phân lớp con Activity (Hoạt động) và ghi đè phương thức dispatchKeyEvent(KeyEvent event) để đảm bảo các khoá bị chặn khi cần thiết hoặc được xử lý khi không được xử lý ở các lớp thấp hơn.