3

我编写了一个非常简单的 android 应用程序,我可以在 pad 上画一些东西。用手指触摸屏幕,你会看到一个绿球,移动你的手指,你会看到一条红线。

但是我发现了一件很奇怪的事情:如果我用两根手指一个接一个地快速触摸屏幕,它会在它们之间划出一条线!(想象您正在按键盘jkjkjkjkjkjjkjkjkjkjkjkj上的两个键)

关键代码非常简单:

public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            multiTouch = false;

            id = event.getPointerId(0);
            PointF p = getPoint(event, 0);
            path = new Path();
            path.moveTo(p.x, p.y);
            paths.add(path);

            points.add(copy(p));
            break;
        case MotionEvent.ACTION_POINTER_DOWN:
            multiTouch = true;
            for (int i = 0; i < event.getPointerCount(); i++) {
                int tId = event.getPointerId(i);
                if (tId != id) {
                    points.add(getPoint(event, i));
                }
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (!multiTouch) {
                p = getPoint(event, 0);
                path.lineTo(p.x, p.y);
            }
            break;
    }

    invalidate();

    return true;
}

完整来源在这里:https ://github.com/freewind/TouchTest/blob/master/src/com/example/MyImageView.java

这是一个工作演示:https ://github.com/freewind/TouchTest

或者你可以在你的安卓设备上下载签名的apk,然后自己测试:https ://github.com/freewind/TouchTest/blob/master/TouchTest.apk?raw=true

您可以在我的代码中看到,我已经检查了它是否是多点触控并在这种情况下禁用了绘图。

我的android版本是4.0,我的代码目标是2.3.3

我的android pad上有一张图片:

在此处输入图像描述

你可以看到有一些线,但它不应该是,红线的左边应该有一个绿球。

我不确定为什么 android 将快速单点触摸视为移动,我考虑了 3 个原因:

  1. 我的代码有问题
  2. Android sdk 有问题
  3. 我的 android pad 有问题,例如缺少 ACTION_DOWN 事件

如何找出真正的原因?


更新

我的一个朋友用他的android手机(android 2.1)测试了这个应用程序,发现没有红线,另一个使用android 2.3.5,发现有红线。

请查看我的代码,我已经检查了多点触控,如果超过 1 点将ACTION_POINTER_DOWN不执行任何操作。ACTION_MOVE所以id不需要of点。(实际上,在此代码的第一个版本中,我使用id了但有同样的问题)。

而且我不认为这是一种预期的行为,因为它使触摸程序的开发变得困难。我发现这个问题是因为在我的另一个应用程序中(用户可以用手指拖动/缩放/旋转图像),图像有时会在屏幕上“跳跃”。

我什至在我的 android pad 和 iTouch 上尝试了一个流行的游戏(Fruit Ninja),发现 android 版本有问题,但 iTouch 没有。

现在我确定有什么问题(当第一根手指竖起时错过了一个ACTION_UP事件),但我仍然不知道是什么原因造成的。我的安卓平板?还是安卓sdk?

4

2 回答 2

0

这就是它适用于多点触控的方式。当您按下快速 android 将其作为手势处理时,您将有 2 个按下的指针。为避免它尝试处理 action_up,或改用 action_pointer_down

于 2012-09-01T16:00:30.917 回答
0

您可以检查 touch 的 id ,以便您只处理第一次触摸。

或者,您可以监视所有触摸并一起处理它们。

于 2012-09-01T18:42:27.217 回答