Bút cảm ứng có thể là một công cụ đặc biệt hữu dụng và sáng tạo. Tuy nhiên, khi vẽ, viết hoặc tương tác với ứng dụng bằng bút cảm ứng, đôi lúc 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.
Các phương pháp hay nhất
Ứ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 đó. Trong Jetpack Compose, bạn có thể truy cập vào MotionEvent Android cơ bản từ PointerEvent. Kiểm tra MotionEvent để tìm ACTION_CANCEL. Lệnh này cho biết một cử chỉ cần dừng và có thể cần được khôi phục. Trên Android 13 (API cấp 33) trở lên, hãy kiểm tra cờ FLAG_CANCELED trên các sự kiện ACTION_CANCEL và ACTION_POINTER_UP. Cờ này cung cấp một tín hiệu mạnh mẽ cho biết thao tác chạm là ngoài ý muốn, chẳng hạn như thao tác chạm lòng bàn tay.
Nguyên liệu
Modifier.pointerInput(): Đối tượng sửa đổi Compose dùng để xử lý dữ liệu đầu vào của con trỏ.PointerEvent: Biểu thị một sự kiện con trỏ trong Compose, chứa một hoặc nhiều thay đổi.PointerEvent.motionEvent: Thuộc tính tiện ích cung cấp quyền truy cập vàoMotionEventAndroid cơ bản (có thể rỗng).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.ACTION_CANCEL: Hằng sốMotionEventcho biết một cử chỉ đã bị huỷ; cử chỉ này sẽ dừng và có thể cần được khôi phục.ACTION_POINTER_UP: Hằng sốMotionEventcho 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ốMotionEventcho 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_UPvàACTION_CANCELtrên Android 13 (API cấp 33) trở lên.
Các bước
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 điểm của sự kiện:
- Sự kiện chạm con trỏ một lần — Kiểm tra để tìm
ACTION_CANCEL, cho biết cử chỉ cần dừng. Trên Android 13 trở lên, hãy kiểm tra để tìm cảFLAG_CANCELEDnhằm xác nhận rằng bạn đã vô tình chạm vào màn hình. - Sự kiện chạm con trỏ nhiều lần – Trên Android 13 trở lên, hãy kiểm tra để tìm
ACTION_POINTER_UPvàFLAG_CANCELEDnhằm xác định các thao tác chạm ngoài ý muốn.
Phản hồi các sự kiện này bằng cách dừng cử chỉ và khôi phục mọi thay đổi tạm thời.
1. Thu nhận đối tượng sự kiện chuyển động
Sử dụng Modifier.pointerInput để xử lý phương thức nhập bằng con trỏ trên một thành phần kết hợp. Trong phạm vi đầu vào của con trỏ, hãy sử dụng awaitPointerEventScope và awaitPointerEvent để nhận các sự kiện, đồng thời truy xuất MotionEvent Android cơ bản bằng cách sử dụng thuộc tính motionEvent:
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent if (motionEvent != null) { // Process motion event. } } } } )
2. Xác định thao tác và cờ cho sự kiện
Kiểm tra MotionEvent để 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:
import androidx.compose.ui.input.pointer.pointerInput Box( modifier = Modifier .fillMaxSize() .pointerInput(Unit) { awaitPointerEventScope { while (true) { val event = awaitPointerEvent() val motionEvent = event.motionEvent ?: continue when (motionEvent.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 && (motionEvent.flags and MotionEvent.FLAG_CANCELED) == MotionEvent.FLAG_CANCELED ) { // Process canceled multi-pointer motion event for Android 13 and higher. } } } } } } )
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. Hãy xem ví dụ ở 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.
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.
Tài nguyên khác
Để biết thêm thông tin, hãy xem phần dưới đây:
- Các tính năng và API của Android 13 – Cải thiện khả năng chống tì tay
- Hướng dẫn cho nhà phát triển
- Các tính năng nâng cao của bút cảm ứng
- Phần Chống tì tay trong bài viết Khả năng tương thích đầu vào trên màn hình lớn
- Lớp học lập trình — Tăng cường hỗ trợ bút cảm ứng trong ứng dụng Android