最近在写一个Android 应用程序。想学习使用多点触控和单点触控。单点触控可以移动画面。多点可以放大和缩小画面。很多应用都有这样的功能。
但是在写的过程中发现这样一个非常纠结的问题。每次多点触控的时候,同时也识别为单点触控。于是乎同时执行单点触控和多点触控的代码。这样有比较大的干扰。不知道各位大神有什么样的建议。
switch(event.getPointerCount()){
case 2:
switch(event.getAction()){
case MotionEvent.ACTION_POINTER_2_DOWN:
moveX = event.getX(1) - event.getX(0);
moveY = event.getY(1) - event.getY(0);
beforeDistance = (float)Math.sqrt(moveX*moveX + moveY*moveY);
Log.i(TAG, "pointer down: " +x0+" "+ y0);
break;
case MotionEvent.ACTION_POINTER_UP:
moveX = event.getX(1) - event.getX(0);
moveY = event.getY(1) - event.getY(0);
afterDistance = (float)Math.sqrt(moveX*moveX + moveY*moveY);
int width = (int)(iView.getWidth()*afterDistance/beforeDistance);
int height = (int)(iView.getHeight()*afterDistance/beforeDistance);
iView.layout(x0, y0, x0 + width, y0 + height);
Log.i(TAG, "pointer up: " +x0+" "+ y0);
break;
default:
break;
}
break;
case 1:
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mx = (int) (event.getX() - x + x0);
my = (int) (event.getY() - y + y0);
iView.layout(mx , my , mx + iView.getWidth(), my + iView.getHeight());
break;
case MotionEvent.ACTION_UP:
x0 = mx;
y0 = my;
Log.i(TAG, x0+", "+y0);
break;
default:
break;
}
break;
default:
break;
}
但是在写的过程中发现这样一个非常纠结的问题。每次多点触控的时候,同时也识别为单点触控。于是乎同时执行单点触控和多点触控的代码。这样有比较大的干扰。不知道各位大神有什么样的建议。
switch(event.getPointerCount()){
case 2:
switch(event.getAction()){
case MotionEvent.ACTION_POINTER_2_DOWN:
moveX = event.getX(1) - event.getX(0);
moveY = event.getY(1) - event.getY(0);
beforeDistance = (float)Math.sqrt(moveX*moveX + moveY*moveY);
Log.i(TAG, "pointer down: " +x0+" "+ y0);
break;
case MotionEvent.ACTION_POINTER_UP:
moveX = event.getX(1) - event.getX(0);
moveY = event.getY(1) - event.getY(0);
afterDistance = (float)Math.sqrt(moveX*moveX + moveY*moveY);
int width = (int)(iView.getWidth()*afterDistance/beforeDistance);
int height = (int)(iView.getHeight()*afterDistance/beforeDistance);
iView.layout(x0, y0, x0 + width, y0 + height);
Log.i(TAG, "pointer up: " +x0+" "+ y0);
break;
default:
break;
}
break;
case 1:
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
break;
case MotionEvent.ACTION_MOVE:
mx = (int) (event.getX() - x + x0);
my = (int) (event.getY() - y + y0);
iView.layout(mx , my , mx + iView.getWidth(), my + iView.getHeight());
break;
case MotionEvent.ACTION_UP:
x0 = mx;
y0 = my;
Log.i(TAG, x0+", "+y0);
break;
default:
break;
}
break;
default:
break;
}
解决方案 »
- 执行到onStart时,为什么页面没有显示出来?
- 求助
- 关于android的几个小问题
- 看到网上有说华为推送的九种武器,到底是哪九种啊?
- 适应横竖屏切换的问题
- 新人求助:关于listview 使用SimpleCursorAdapter问题
- 怎么对ListView添加点击事件,每行点击都打开一个新的Activity。
- 请问什么情况下要用到重写toString()方法,这个方法怎么用?
- 在XML布局中用dip为单位设置了某个控件的宽度和高度, 但用java代码生成控件时单位只有int,怎么办?
- Android 图片压缩的问题,求指教
- SharedPreferences.Editor里的抽象方法putXXX()为什么不用自己实现
- 我layout的XML有什么问题呢?
就无法识别。只有MotionEvent.ACTION_POINTER_2_DOWN才可以识别。这是为什么
如果action没有被mask与掉的话就只能识别MotionEvent.ACTION_POINTER_2_DOWN
还有两指操作和一指操作两种逻辑互相影响的问题啊,我觉得还是搞几个标志量区分一下比较好,flag为true时候只处理双指逻辑,false时候只处理单指逻辑
if (event.getPointerCount() == 2) { if (isFirst) { // 得到第一次触屏时线段的长度
oldLineDistance = (float) Math.sqrt (Math.pow(event.getX(1) - event.getX(0), 2)
+ Math.pow(
event.getY(1)
- event.getY(0), 2));
isFirst = false;
//Log.d("ewd", "第一次触摸线段长度:"+oldLineDistance);
} else { // 得到第一次触屏时线段的长度
newLineDistance = (float) Math.sqrt (Math.pow(event.getX(1) - event.getX(0), 2)
+ Math.pow(
event.getY(1)
- event.getY(0), 2));
//Log.d("ewd", "第二次触摸线段长度:"+newLineDistance);
} }
}
然后再if (MotionEvent.ACTION_UP == event.getAction()) {
if(newLineDistance>oldLineDistance){
执行你的缩放操作
}
}