是这样的,我正在研究一个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。大家遇到过这种问题吗?
解决方案 »
- java.lang.IllegalArgumentException: Unknown URI content:
- 请问关于创建 imageview对象的
- 有关listView里面自定义items布局的问题
- android2.1 使用自己变得SDK,用eclipse创建工程,没有R.java
- Win7上安装ADT为什么老装不好
- android UI呈现
- 一个空指针问题
- 求大神求解脱 来看看我的代码
- ECLIPSE 中没有AVD
- 魅族适配menuitem没显示
- 想利用空闲时间学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);
以后可能会遇到类似的问题。