1

请查看从覆盖onTouchEvent的 a中获取的此代码示例View

@Override
public boolean onTouchEvent(MotionEvent event) {

    float eventX = event.getX(); 
    float eventY = event.getY();    

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            //code move pointer position
            break;

        case MotionEvent.ACTION_MOVE:
            // code to draw line from x to y
            break;

        case MotionEvent.ACTION_UP:
             //Release pointer
             break;
        default:
            return false;
    }
}

这画线很好,但问题是当我用单指触摸一个角并用另一根手指触摸屏幕的下一个角并按住它然后松开第一根手指时。它会自动从一根手指画线到另一根手指。但在我的应用程序中,用户必须使用单指手动绘制线条。

这是发生的事情

为了克服这个问题,我尽我所能。这也不是一个Multitouch事件。

这是Android框架的错吗?

此外:

我从Playstore下载了许多绘图应用程序,以检查它们是否阻止了此类自动绘图。但是所有应用程序的行为都与我的相同。

我该如何解决这个问题?

4

2 回答 2

1

不管你怎么说,你还是遇到了多点触控事件。在 Android 中,初始触地是 ACTION_DOWN。第二次触摸是 ACTION_POINTER_DOWN。之后任何一个手指的任何移动,即使是单个像素,都会导致 ACTION_MOVE。所以你或多或少会得到不断的动作。解决方案是使用指针 id 来确定哪个手指是第一根手指向下,并且仅在获得 MOVE 时查看该指针 id,而忽略其中的所有其他指针。

于 2018-03-09T06:28:04.090 回答
1

您只需添加case MotionEvent.ACTION_POINTER_UP并释放您的积分。当你的case in case MotionEvent.ACTION_POINTER_UP,此时,你抬起你的手指,程序将运行在action_move,此时,你只需中断这个动作。
我的例子是这样的:

  boolean isRelease = false;
  @Override public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        isRelease = false;
        //code move pointer position
        break;
      case MotionEvent.ACTION_MOVE:
        if (isRelease) {
          return true;
        }
        // code to draw line from x to y
        break;
      case MotionEvent.ACTION_POINTER_UP:
        isRelease = true;
        //Release pointer
        break;
      case MotionEvent.ACTION_UP:
        isRelease = true;
        //Release pointer
        break;
    }
    return true;
  }

对不起我糟糕的英语。

于 2018-03-09T10:54:08.800 回答