控件触摸事件

 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 }

 

posted @ 2013-06-27 13:10  轻云沉峰  阅读(316)  评论(0编辑  收藏  举报