Từ chối thao tác chạm bằng bút cảm ứng

Khi vẽ, viết hoặc tương tác với ứng dụng bằng bút cảm ứng, đôi khi người dùng sẽ tì tay lên màn hình. Ứng dụng của bạn có thể sẽ nhận được báo cáo về sự kiện chạm trước khi hệ thống nhận ra và loại bỏ sự kiện đó dưới dạng thao tác vô tình tì tay.

Xác định và bỏ qua thao tác chạm bằng lòng bàn tay

Ứng dụng của bạn phải xác định các sự kiện chạm dư thừa và bỏ qua những sự kiện đó. Android huỷ thao tác tì tay bằng cách gửi một đối tượng MotionEvent đến ứng dụng của bạn.

  • Kiểm tra các đối tượng MotionEvent được gửi đến ứng dụng của bạn. Sử dụng các API MotionEvent để xác định các thuộc tính sự kiện (hành động và cờ):

    • Sự kiện chạm con trỏ một lần — Kiểm tra để tìm ACTION_CANCEL. Trên Android 13 trở lên, hãy kiểm tra để tìm cả FLAG_CANCELED.
    • Sự kiện chạm nhiều con trỏ – Trên Android 13 trở lên, hãy kiểm tra để tìm ACTION_POINTER_UPFLAG_CANCELED.
  • Bỏ qua các sự kiện chuyển động có thuộc tính ACTION_CANCELACTION_POINTER_UP/FLAG_CANCELED.

1. Thu nhận đối tượng sự kiện chuyển động

Thêm OnTouchListener vào ứng dụng:

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        // Process motion event.
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    // Process motion event.
});

2. Xác định thao tác và cờ cho sự kiện

Kiểm tra để tìm ACTION_CANCEL (cho biết sự kiện chạm con trỏ một lần ở mọi cấp độ API). Trên Android 13 trở lên, hãy kiểm tra ACTION_POINTER_UP để tìm FLAG_CANCELED.

Kotlin

val myView = findViewById<View>(R.id.myView).apply {
    setOnTouchListener { view, event ->
        when (event.actionMasked) {
            MotionEvent.ACTION_CANCEL -> {
                //Process canceled single-pointer motion event for all SDK versions.
            }
            MotionEvent.ACTION_POINTER_UP -> {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
                   (event.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                    //Process canceled multi-pointer motion event for Android 13 and higher.
                }
            }
        }
        true
    }
}

Java

View myView = findViewById(R.id.myView);
myView.setOnTouchListener( (view, event) -> {
    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_CANCEL:
            // Process canceled single-pointer motion event for all SDK versions.
        case MotionEvent.ACTION_UP:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU &&
               (event.getFlags() & MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED) {
                //Process canceled multi-pointer motion event for Android 13 and higher.
            }
    }
    return true;
});

3. Huỷ cử chỉ

Sau khi xác định thấy thao tác tì tay, bạn có thể huỷ các hiệu ứng trên màn hình của cử chỉ.

Ứng dụng phải lưu nhật ký thao tác của người dùng để có thể huỷ thao tác nhập ngoài ý muốn, chẳng hạn như tì tay. Để biết ví dụ về cách duy trì nhật ký, hãy xem phần Triển khai ứng dụng vẽ cơ bản trong lớp học lập trình Tăng cường hỗ trợ bút cảm ứng trong ứng dụng Android.

Điểm chính

  • MotionEvent: Biểu thị các sự kiện chạm và chuyển động. Chứa thông tin cần thiết để xác định xem có nên bỏ qua một sự kiện hay không.
  • OnTouchListener#onTouch(): Nhận các đối tượng MotionEvent.
  • MotionEvent#getActionMasked(): Trả về thao tác liên quan đến một sự kiện chuyển động.
  • ACTION_CANCEL: Hằng số MotionEvent cho biết cần huỷ một cử chỉ.
  • ACTION_POINTER_UP: Hằng số MotionEvent cho biết rằng con trỏ không phải là con trỏ đầu tiên đã dịch chuyển lên (nghĩa là con trỏ đã ngừng tiếp xúc với màn hình thiết bị).
  • FLAG_CANCELED: Hằng số MotionEvent cho biết rằng việc con trỏ dịch chuyển lên tạo ra một sự kiện chạm ngoài ý muốn. Đã thêm vào các sự kiện ACTION_POINTER_UPACTION_CANCEL trên Android 13 (API cấp 33) trở lên.

Kết quả

Giờ đây, ứng dụng của bạn có thể xác định và từ chối thao tác tì tay đối với các sự kiện chạm con trỏ nhiều lần ở những cấp độ API từ Android 13 trở lên và các sự kiện chạm con trỏ một lần ở mọi cấp độ API.

Các bộ sưu tập chứa hướng dẫn này

Hướng dẫn này là một phần của các bộ sưu tập Hướng dẫn nhanh được tuyển chọn này, bao gồm các mục tiêu phát triển Android rộng hơn:

Cho phép ứng dụng của bạn hỗ trợ trải nghiệm người dùng được tối ưu hoá trên máy tính bảng, thiết bị có thể gập lại và thiết bị ChromeOS.

Bạn có câu hỏi hoặc ý kiến phản hồi

Hãy truy cập vào trang câu hỏi thường gặp để tìm hiểu về các hướng dẫn nhanh hoặc liên hệ với chúng tôi để cho chúng tôi biết suy nghĩ của bạn.