【发布时间】: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 个原因:
- 我的代码有问题
- Android sdk 有问题
- 我的 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?
【问题讨论】: