拒绝手写笔误触

当用户使用手写笔在应用中绘画、书写或互动时,他们有时会用手掌触碰屏幕。在系统识别并驳回此意外手掌触碰事件之前,触碰事件可能会报告给您的应用。

识别并忽略手掌触碰

您的应用必须识别并忽略多余的触碰事件。Android 会通过向您的应用分派一个 MotionEvent 对象来取消手掌触碰。

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

  • 忽略具有 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 设备上支持优化的用户体验。

有问题或反馈?

转到我们的常见问题页面了解快速指南,或者联系我们并告诉我们您的想法。