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 APIMotionEvent
để 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_UP
vàFLAG_CANCELED
.
- Sự kiện chạm con trỏ một lần — Kiểm tra để tìm
Bỏ qua các sự kiện chuyển động có thuộc tính
ACTION_CANCEL
vàACTION_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ượngMotionEvent
.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ệnACTION_POINTER_UP
vàACTION_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: