在MotionEvent中有两个事件值得注意一下,分别是ACTION_DOWN和ACTION_POINTER_DOWN。
ACTION_DOWN:这个很好理解,当屏幕检测到有手指按下之后就触发到这个事件。
ACTION_POINTER_DOWN:这个是实现多点的关键,当屏幕检测到有多个手指同时按下之后,就触发了这个事件。
通过getAction()可以获得当前屏幕的事件类型:ACTION_DOWN, ACTION_MOVE, ACTION_UP, or ACTION_CANCEL。但是如果像获得如上的ACTION_POINTER_DOWN,则得和ACTION_MASK相与才能得到ACTION_POINTER_DOWN事件。
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
ImageViewview=(ImageView)v;
dumpEvent(event);
//Handletoucheventshere...
switch(event.getAction()&MotionEvent.ACTION_MASK){
caseMotionEvent.ACTION_DOWN:
matrix.set(view.getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(),event.getY());
//Log.d(TAG,"mode=DRAG");
mode=DRAG;
//Log.d(TAG,"mode=NONE");
break;
caseMotionEvent.ACTION_POINTER_DOWN:
oldDist=spacing(event);
//Log.d(TAG,"oldDist="+oldDist);
if(oldDist>10f){
savedMatrix.set(matrix);
midPoint(mid,event);
mode=ZOOM;
//Log.d(TAG,"mode=ZOOM");
}//ACTION_DOWN,ACTION_MOVE,ACTION_UP,orACTION_CANCEL.
break;
caseMotionEvent.ACTION_UP:
caseMotionEvent.ACTION_POINTER_UP:
mode=NONE;
break;
caseMotionEvent.ACTION_MOVE:
if(mode==DRAG){
//...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX()-start.x,event.getY()
-start.y);
}elseif(mode==ZOOM){
floatnewDist=spacing(event);
//Log.d(TAG,"newDist="+newDist);
if(newDist>10f){
matrix.set(savedMatrix);
floatscale=newDist/oldDist;
matrix.postScale(scale,scale,mid.x,mid.y);
}
}
break;
}
view.setImageMatrix(matrix);
returntrue;//indicateeventwashandled
}
privatevoiddumpEvent(MotionEventevent){
Stringnames[]={"DOWN","UP","MOVE","CANCEL","OUTSIDE",
"POINTER_DOWN","POINTER_UP","7?","8?","9?"};
StringBuildersb=newStringBuilder();
intaction=event.getAction();
intactionCode=action&MotionEvent.ACTION_MASK;
sb.append("eventACTION_").append(names[actionCode]);
if(actionCode==MotionEvent.ACTION_POINTER_DOWN
||actionCode==MotionEvent.ACTION_POINTER_UP){
sb.append("(pid").append(
action>>MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")");
}
sb.append("[");
for(inti=0;i
sb.append("#").append(i);
sb.append("(pid").append(event.getPointerId(i));
sb.append(")=").append((int)event.getX(i));
sb.append(",").append((int)event.getY(i));
if(i+1
sb.append(";");
}
sb.append("]");
//Log.d(TAG,sb.toString());
}
/**
*求两点间距离:
*/
privatefloatspacing(MotionEventevent){
floatx=event.getX(0)-event.getX(1);
floaty=event.getY(0)-event.getY(1);
returnFloatMath.sqrt(x*x+y*y);
}
/**
*求两点间中点
*/
privatevoidmidPoint(PointFpoint,MotionEventevent){
floatx=event.getX(0)+event.getX(1);
floaty=event.getY(0)+event.getY(1);
point.set(x/2,y/2);
}
将以上代码写到MulitPointTouchListener .java中,然后对你相应的图片进行OnTouchListener比如:imageView.setOnTouchListener(new MulitPointTouchListener ());在xml中要将图片的缩放格式改成Matrix