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 }