1 imageView.setOnTouchListener(); 2 3 private final class TouchListener implements OnTouchListener{ 4 private int mode = 0; 5 private static final int DRAG = 1;// 拖拉 6 private static final int ZOOM = 2;// 缩放 7 // 存放开始点 8 private PointF startPoint = new PointF(); 9 // 矩阵对象移动 10 private Matrix matrix = new Matrix(); 11 private Matrix currentMatrix = new Matrix(); 12 private float startDis;// 开始距离 13 // 记录中心点 14 private PointF pointF;// 中心点 15 16 @Override 17 public boolean onTouch(View v,MotionEvent event){ 18 switch(event.getAction() & MotionEvent.ACTION_MASK){ // 返回int 低8位存放触摸事件,&运算屏蔽高8位 19 case MotionEvent.ACTION_DOWN: // 按下 20 mode = DRAG;// 刚按下时为拖拉 21 currentMatrix.set(imageView.getImageMatrix());// 记录图片当前的位置 22 startPoint.set(event.getX(),event.getY()); 23 break; 24 25 case MotionEvent.ACTION_MOVE:// 移动 26 27 if(mode == DRAG){ 28 29 float dx = event.getX() - startPoint.x;// x轴移动距离 30 float dy = event.getY() - startPoint.y;// y轴移动距离 31 matrix.set(currentMatrix);// 在上次的移动位置上移动 32 matrix.postTranslate(dx,dy);// 移动 33 34 }else if(mode == ZOOM){ 35 36 float endDis = distance(event);// 结束距离 37 if(endDis >10f){ 38 float scale = endDis/startDis; 39 matrix.set(currentMatrix);// 记录上次放大 40 matrix.posScale(scale,scale,pointF.x,pointF.y);// x、y缩放倍数 x、y参考点 41 } 42 } 43 44 45 break; 46 47 case MotionEvent.ACTION_POINTER_DOWN:// 屏幕上已经有触点,再按下时 48 mode = ZOOM;// 两个或以上触点 模式为缩放 49 startDis = distance(event);// 开始距离 50 if(startDis >10f){ // 大于10个像素才处理 51 // 计算中心点 52 pointF = mid(event); 53 // 记录当前放大倍数 54 currentMatrix.set(imageView.getImageMatrix()); 55 } 56 57 break; 58 59 case MotionEvent.ACTION_UP;// 松开 60 case MotionEvent.ACTION_POINTER_UP:// 已经松开,屏幕还有触点 61 mode = 0;// 恢复 62 break; 63 64 //case MotionEvent.ACTION_POINTER:// 65 // break; 66 } 67 imageView.setImageMatrix(matrix);// 移动 68 return true; 69 } 70 71 72 /** 73 * 计算两点间距离 74 */ 75 public static float distance(MotionEvent event){ 76 float dx = event.getX(1) - event.getX(0); 77 float dy = event.getY(1) - event.getY(0); 78 return Floatmath.sqrt(dx*dx + dy*dy);// 开平方 79 } 80 81 82 /** 83 * 计算中心点 84 */ 85 public static float mid(MotionEvent event){ 86 float midX = (event.getX(1) + event.getY(0) )/2; 87 float midY = (event.getY(1) + event.getY(0))/2; 88 return new PointF(midX,midY); 89 } 90 }