我编写了一个非常简单的 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,发现有红线。
请查看我的代码,我已经检查了多点触控,如果超过 1 点将ACTION_POINTER_DOWN
不执行任何操作。ACTION_MOVE
所以id
不需要of点。(实际上,在此代码的第一个版本中,我使用id
了但有同样的问题)。
而且我不认为这是一种预期的行为,因为它使触摸程序的开发变得困难。我发现这个问题是因为在我的另一个应用程序中(用户可以用手指拖动/缩放/旋转图像),图像有时会在屏幕上“跳跃”。
我什至在我的 android pad 和 iTouch 上尝试了一个流行的游戏(Fruit Ninja),发现 android 版本有问题,但 iTouch 没有。
现在我确定有什么问题(当第一根手指竖起时错过了一个ACTION_UP
事件),但我仍然不知道是什么原因造成的。我的安卓平板?还是安卓sdk?