当用户使用手写笔在应用中绘画、书写或互动时,他们有时会用手掌触碰屏幕。在系统识别并驳回此意外手掌触碰事件之前,触碰事件可能会报告给您的应用。
识别并忽略手掌触碰
您的应用必须识别并忽略多余的触碰事件。Android 会通过向您的应用分派一个 MotionEvent
对象来取消手掌触碰。
检查分派到您应用的
MotionEvent
对象。使用MotionEvent
API 确定事件属性(动作和标志)。- 单指事件 — 检查
ACTION_CANCEL
。在 Android 13 及更高版本上,还要检查FLAG_CANCELED
。 - 多指事件 — 在 Android 13 及更高版本上,检查
ACTION_POINTER_UP
和FLAG_CANCELED
。
- 单指事件 — 检查
忽略具有
ACTION_CANCEL
和ACTION_POINTER_UP
/FLAG_CANCELED
属性的动作事件。
1. 获取动作事件对象
将一个 OnTouchListener
添加到您的应用
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. 确定事件动作和标志
检查 ACTION_CANCEL
,它表示所有 API 级别上的单指事件。在 Android 13 及更高版本上,检查 ACTION_POINTER_UP
是否设置了 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. 撤销手势
识别出手掌触碰后,您可以撤销手势的屏幕效果。
您的应用必须保留用户操作历史记录,以便撤销手掌触碰等无意输入。如需了解如何维护历史记录的示例,请参阅 实现基本绘图应用(位于增强 Android 应用中的手写笔支持 Codelab)。
要点
MotionEvent
:表示触碰和移动事件。包含确定是否应忽略某个事件所需的信息。OnTouchListener#onTouch()
:接收MotionEvent
对象。MotionEvent#getActionMasked()
:返回与动作事件关联的动作。ACTION_CANCEL
:MotionEvent
常量,表示应撤销手势。ACTION_POINTER_UP
:MotionEvent
常量,表示除第一个指针之外的其他指针已抬起(即已解除与设备屏幕的接触)。FLAG_CANCELED
:MotionEvent
常量,表示指针抬起导致了无意触碰事件。在 Android 13 (API 级别 33) 及更高版本上添加到ACTION_POINTER_UP
和ACTION_CANCEL
事件中。
结果
您的应用现在可以在 Android 13 及更高 API 级别上识别并拒绝多指事件的手掌触碰,并在所有 API 级别上识别并拒绝单指事件的手掌触碰。
包含此指南的收藏集
此指南是这些精选快速指南收藏集的一部分,这些收藏集涵盖了更广泛的 Android 开发目标

针对大屏幕优化
使您的应用能够在平板电脑、可折叠设备和 ChromeOS 设备上支持优化的用户体验。
有问题或反馈?
转到我们的常见问题页面了解快速指南,或者联系我们并告诉我们您的想法。