我写了一个非常简单的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
或者您可以在Android设备上下载已签名的apk,并自行测试:https://github.com/freewind/TouchTest/blob/master/TouchTest.apk?raw=true
你可以在我的代码中看到,我已经检查过它是否是多点触控并禁用了该情况。
我的Android版本是4.0,我的代码目标是2.3.3
我的android pad上有一张图片:
你可以看到有一些线但不应该是,红线的左边应该有一个绿球。
我不确定为什么android会将快速单点触控视为移动,我考虑了3个原因:
如何找出真正的原因?
更新
我的一个朋友用他的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垫?还是Android sdk?
答案 0 :(得分:0)
这是多点触控的方式。当你按下快速android处理它作为手势,你将有2个按下指针。为了避免它尝试处理action_up,或者使用action_pointer_down
答案 1 :(得分:0)
您可以检查触摸的ID,这样您就只能处理第一次触摸。
或者,您可以监控所有触摸并一起处理它们。