【问题标题】:Android will treat fast single touch as move?Android会将快速单点触摸视为移动?
【发布时间】:2012-09-01 15:54:18
【问题描述】:

我编写了一个非常简单的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发现有红线。

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

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

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

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

【问题讨论】:

    标签: android touch


    【解决方案1】:

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

    【讨论】:

    • single-touch 时会出现此问题。我检查过它是否是多点触控,然后什么也没做。不需要action_upaction_point_down 的句柄,因为对于ACTION_MOVE,它只会在有一个新的FRESH 单ACTION_DOWN 时画线。
    【解决方案2】:

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

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

    【讨论】:

    • 在我的第一个版本中,我使用了id,但遇到了同样的问题。你可以在我的代码中看到,如果有一个 NEW FRESH ACTION_DOWN,我只会在 ACTION_MOVE 中画线。它可以确保绘图手指不被改变。
    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多