android-MotionEvent多个触摸事件混合并相互影响(请参见演示视频)
作者:互联网
该应用程序的目的:
一个简单的应用程序,它为屏幕上识别出的每个触摸绘制一个圆圈,并跟踪触摸事件.在“高压读数” getPressure(int pointerIndex)上,圆圈的颜色将改变,半径将增加.另外,在手指触摸旁边显示带有getPointerId(intpointerIndex),x和y坐标以及压力的触摸ID.
遵循重要部分的代码片段(请原谅,这不是最好的代码;)我知道)
protected void onDraw(Canvas canvas){
//draw circle only when finger(s) is on screen and moves
if(iTouchAction == (MotionEvent.ACTION_MOVE)){
int x,y;
float pressure;
//Draw circle for every touch
for (int i = 0; i < touchEvent.getPointerCount(); i++){
x = (int)touchEvent.getX(i);
y = (int)touchEvent.getY(i);
pressure = touchEvent.getPressure(i);
//High pressure
if (pressure > 0.25){
canvas.drawCircle(x, y, z+30, pressureColor);
canvas.drawText(""+touchEvent.getPointerId(i)+" | "+x+"/"+y, x+90, y-80, touchColor);
canvas.drawText(""+pressure, x+90, y-55, pressureColor);
}else{ //normal touch event
canvas.drawCircle(x, y, z, touchColor);
canvas.drawText(""+touchEvent.getPointerId(i)+" | "+x+"/"+y, x+60, y-50, touchColor);
canvas.drawText(""+pressure, x+60, y-25, pressureColor);
}
}
}
}
问题:
测试平台是运行Android 2.1的HTC Desire.该应用程序可以正常工作,并且可以毫无问题地跟踪两个手指.但是似乎两个接触点在彼此接近时会互相干扰-好像它们“捕捉”到共享的x和y轴.有时他们甚至交换另一个触摸事件的输入坐标.另一个问题是,即使getPressure(int pointerIndex)引用了一个PointerID,两个触摸事件的压力读数也相同.
由于这有点抽象,请在此处找到视频:http://www.youtube.com/watch?v=bFxjFexrclU
我的问题:
>我的代码仅仅是错误的吗?
> Android 2.1是否不能很好地处理触摸事件,使事情变得混乱起来?
>这是硬件问题,与1)和2)无关吗?
感谢您的回答和/或重新链接到其他线程(很抱歉,可以找到一个解决此问题的线程).
克里斯
解决方法:
我不愿意告诉你,但这是你的硬件.
Nexus One(我相信它与HTC Desire中使用的硬件相同)中使用的触摸面板因这种特殊工件而闻名.我们通过删除一些可检测到的不良事件来缓解Android 2.2的ACTION_POINTER_UP / DOWN事件周围的“跳到另一根手指的轴”问题,但是当指针沿一个轴靠近时,问题仍然存在.该面板还以随机反转X和Y坐标数据而著称;两个点(x0,y0)和(x1,y1)变为(x0,y1)和(x1,y0).不幸的是,当Android本身掌握了“真实”数据时,您只能做很多事情.
这不是唯一具有躲避式多点触摸功能的面板.要在运行时判断屏幕是否具有能够精确进行多点触摸数据报告的功能,而不会出现此类问题,请使用PackageManager检查FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT
.如果没有此功能,您仍然可以可靠地执行一些操作,例如缩放手势.
标签:multi-touch,android-2-1-eclair,events,android 来源: https://codeday.me/bug/20191105/1997744.html