拒绝触控笔手掌轻触

使用触控笔绘图、手写或与应用互动时,用户有时会用手掌触摸屏幕。系统可能会在将其识别为意外手掌误触并予以忽略之前便将相应触摸事件报告给您的应用。

识别并忽略手掌轻触

您的应用必须识别无关的触摸事件,并忽略这些事件。Android 通过向您的应用分派 MotionEvent 对象来取消手掌触摸。

  • 检查分派给您的应用的 MotionEvent 对象。使用 MotionEvent API 确定事件属性(操作和标志):

    • 单指针事件 - 检查是否有 ACTION_CANCEL。在 Android 13 及更高版本中,还要检查是否有 FLAG_CANCELED
    • 多指针事件 - 在 Android 13 及更高版本中,检查是否有 ACTION_POINTER_UPFLAG_CANCELED
  • 忽略具有 ACTION_CANCELACTION_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_CANCELMotionEvent 常量,用于表明某手势应被撤消。
  • ACTION_POINTER_UPMotionEvent 常量,用于表明除第一个指针以外的某个指针已被释放(即放弃了与设备屏幕的接触)。
  • FLAG_CANCELEDMotionEvent 常量,用于表明指针释放导致了一次无意中的触摸事件。已添加到 Android 13(API 级别 33)及更高版本的 ACTION_POINTER_UPACTION_CANCEL 事件。

结果

现在,在 Android 13 及更高 API 级别上,您的应用可以针对多指针事件识别和拒绝手掌触摸;在所有 API 级别上,您的应用可以针对单指针事件识别和拒绝手掌触摸。

包含本指南的集合

本指南属于以下精选快速入门指南集合,这些指南涵盖了更广泛的 Android 开发目标:

让您的应用能够在平板电脑、可折叠设备和 ChromeOS 设备上提供优化的用户体验。

有问题或反馈

请访问我们的常见问题解答页面,了解简短指南,或与我们联系,告诉我们您的想法。