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 cơ bản của Android từ a
PointerEvent. Kiểm tra MotionEvent để tìm ACTION_CANCEL (cho biết rằng một cử chỉ sẽ dừng và có thể cần phải quay lại). 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 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 tì tay.
Nguyên liệu
Modifier.pointerInput(): Trình sửa đổi Compose dùng để xử lý dữ liệu đầu vào bằng 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 mở rộng giúp truy cập vàoMotionEventcơ bản của Android (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ỉ sẽ dừng và có thể cần phải quay lại.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ỉ sẽ 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 thao tác chạm là ngoài ý muốn. - 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à quay lại 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ý dữ liệu đầu vào bằng con trỏ trên một thành phần kết hợp. Trong phạm vi dữ liệu đầu vào bằng con trỏ, hãy sử dụng awaitPointerEventScope và awaitPointerEvent để nhận các sự kiện, đồng thời truy xuất MotionEvent cơ bản của Android 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