使用触控笔绘图、手写或与应用互动时,用户有时会用手掌触摸屏幕。系统可能会在将其识别为意外手掌误触并予以忽略之前便将相应触摸事件报告给您的应用。
您的应用必须识别无关的触摸事件,并忽略这些事件。Android 13 及更高级别的 API 与所有其他 API 级别在指示手掌触摸方面有所不同。
结果
在 Android 13 及更高 API 级别上,您的应用可以针对多指针事件识别和拒绝手掌触摸;在所有 API 级别上,您的应用可以针对单指针事件识别和拒绝手掌触摸。
版本兼容性
将项目的 minSDK 设置为 API 级别 33,以用于多指针事件。
API 级别支持单指针事件。
依赖项
无。
识别并忽略手掌触控
Android 通过向您的应用分派 MotionEvent 对象来取消手掌触摸。
检查分派给您的应用的
MotionEvent对象。使用MotionEventAPI 确定事件属性(操作和标志):- 单指针事件 - 检查是否有
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 开发目标: