是这样的,我正在研究一个android的多点触屏问题。我知道android在2.0版本以上的sdk中已经提供了对多点触屏的处理函数,这个函数是这样的:event.getPointerCount(); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置函数很好,我发现的bug在于:当二指触屏时,特别是二指移动引发mov事件时,Event.getX和event.getY取得的x,y坐标会出错。如二指触屏的坐标为(x1,y1)和(x2,y2),实际上坐标值为(50,400)和(280,80)。而用event.getX(0),event.getY(0),event.getX(1),event.getY(1)函数获得的坐标却为(50,80)和(280,400)或者(50,200)和(280,200)。也就是多点触屏的函数获得的x,y坐标的值不准确,这是android的大bug。大家遇到过这种问题吗?
event.getX(nID); //获取第nID个触控点的x位置
event.getY(nID); //获取第nID个点触控的y位置函数很好,我发现的bug在于:当二指触屏时,特别是二指移动引发mov事件时,Event.getX和event.getY取得的x,y坐标会出错。如二指触屏的坐标为(x1,y1)和(x2,y2),实际上坐标值为(50,400)和(280,80)。而用event.getX(0),event.getY(0),event.getX(1),event.getY(1)函数获得的坐标却为(50,80)和(280,400)或者(50,200)和(280,200)。也就是多点触屏的函数获得的x,y坐标的值不准确,这是android的大bug。大家遇到过这种问题吗?
解决方案 »
- 时间设置和file.lastModified()的奇怪问题
- android新手 View的问题
- android 文件下载 急。。。。
- Android系统移植问题求助
- 急求答案谁有
- 引入了外部jar,编译能通过,但模拟器运行时报错
- 一个简单的音乐播放问题
- 求助:autocompletetextview中点击item的问题
- android如何通过网络获取服务器中图片、视频和office文档的缩略图
- abd 批处理重启一批安卓设备,跪求高手赐予一个批处理文件,自动执行终端设备的重启
- 想利用空闲时间学android,希望大家给点意见
- andorid的C++代码文件,都加个namespace android {有什么作用?
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
int pointerId = event.getPointerId(pointerIndex);
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
touched[pointerId] = true;
x[pointerId] = (int)event.getX(pointerIndex);
y[pointerId] = (int)event.getY(pointerIndex);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL:
touched[pointerId] = false;
x[pointerId] = (int)event.getX(pointerIndex);
y[pointerId] = (int)event.getY(pointerIndex);
break;
case MotionEvent.ACTION_MOVE:
int pointerCount = event.getPointerCount();
for (int i = 0; i < pointerCount; i++) {
pointerIndex = i;
pointerId = event.getPointerId(pointerIndex);
x[pointerId] = (int)event.getX(pointerIndex);
y[pointerId] = (int)event.getY(pointerIndex);
}
break;
}
updateTextView();
return true;
}要这样获得ID
public boolean onTouchEvent(MotionEvent event) {
float x[]=new float[2];
float y[]=new float[2];
/**游戏按键的控制**/
switch (event.getPointerCount()) {
case 1:
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x[0]=event.getX();
y[0]=event.getY();
Log.i("event", "---down---x[0]="+x[0]+",y[0]="+y[0]+"---");
return true;
case MotionEvent.ACTION_MOVE:
x[0]=event.getX();
y[0]=event.getY();
Log.i("event", "move---x[0]="+x[0]+",y[0]="+y[0]);
return true;
case MotionEvent.ACTION_UP:
x[0]=event.getX();
y[0]=event.getY();
Log.i("event", "---up---x[0]="+x[0]+",y[0]="+y[0]+"---");
return true;
case MotionEvent.ACTION_CANCEL:
Log.i("event", "-----------cancle----------");
return super.onTouchEvent(event);
}
case 2:
x[0]=event.getX(0);
y[0]=event.getY(0);
x[1]=event.getX(1);
y[1]=event.getY(1);
Log.i("event", "multi---x[0]="+x[0]+",y[0]="+y[0]);
Log.i("event", "multi---x[1]="+x[1]+",y[1]="+y[1]); }
return super.onTouchEvent(event);
}其中,在case 2的状态下,x[0],y[0]和x[1],y[1]会出现错误。
你的代码中涉及到的多点触屏就是上面这些代码。你认为这样获得的x,y值坐标没有问题?把两点的x,y坐标值打印出来,用手机检测时,触屏的两点滑动,滑动路线的x坐标或y坐标交叉,观察x,y的值是否有错。
结果:100%都是我自己犯的低级错误......
x[0]=event.getX(0);
y[0]=event.getY(0);应该是(函数名我有可能拼错):
int id = event.getPointerId(0);
x[0] = event.getX(id);
y[0] = event.getY(id);
以后可能会遇到类似的问题。