手指多点触控事件

 

  1 package com.itheima.touch;
  2 
  3 import android.app.Activity;
  4 import android.graphics.Matrix;
  5 import android.graphics.PointF;
  6 import android.os.Bundle;
  7 import android.view.MotionEvent;
  8 import android.view.View;
  9 import android.view.View.OnTouchListener;
 10 import android.widget.ImageView;
 11 
 12 public class MainActivity extends Activity {
 13 
 14     private ImageView imageView;
 15 
 16     @Override
 17     protected void onCreate(Bundle savedInstanceState) {
 18         super.onCreate(savedInstanceState);
 19         setContentView(R.layout.activity_main);
 20         
 21         imageView = (ImageView) findViewById(R.id.imageView);
 22         imageView.setOnTouchListener(new MyOnTouchListener());        // 添加触摸监听器
 23     }
 24     
 25     private class MyOnTouchListener implements OnTouchListener {
 26         private float x;        // 图片移动前的x轴坐标
 27         private float y;        // 图片移动前的y轴坐标
 28         private Matrix newMatrix = new Matrix();         // 用来移动图片的矩阵
 29         private Matrix oldMatrix = new Matrix();        // 图片移动前的矩阵
 30         private int type;        // 操作类型, 一根手指触摸还是两根手指触摸
 31         private float start;    // 第二根手指按下时的距离
 32         private float end;        // 两根手指移动后的距离
 33         private PointF point;    // 放大时的中心点
 34 
 35         public boolean onTouch(View v, MotionEvent event) {
 36             switch (event.getAction() & MotionEvent.ACTION_MASK) {  
 37                 case MotionEvent.ACTION_DOWN:
 38                     type = 1;
 39                     x = event.getX();
 40                     y = event.getY();
 41                     oldMatrix.set(imageView.getImageMatrix());
 42                     break;
 43                 case MotionEvent.ACTION_POINTER_DOWN:
 44                     type = 2;
 45                     start = countDistance(event);         // 计算第二根手指按下时两点之间的距离
 46                     point = countPoint(event);             // 计算中心点
 47                     oldMatrix.set(imageView.getImageMatrix());
 48                     break;
 49                 case MotionEvent.ACTION_MOVE:
 50                     newMatrix.set(oldMatrix);
 51                     if (type == 1) {     // 1根手指触摸
 52                         newMatrix.postTranslate(event.getX() - x, event.getY() - y);
 53                     } else {             // 2跟手指触摸
 54                         end = countDistance(event);     // 计算结束时距离
 55                         float scale = end / start;         // 计算缩放比例
 56                         newMatrix.postScale(scale, scale, point.x, point.y);     // 对模型进行缩放
 57                     }
 58                     break;
 59             }
 60             imageView.setImageMatrix(newMatrix);     // 改变图片
 61             return true;
 62         }
 63     }
 64 
 65     public float countDistance(MotionEvent event) {
 66         float a = event.getX(1) - event.getX(0);     // x轴距离
 67         float b = event.getY(1) - event.getY(0);     // y轴距离
 68         return (float) Math.sqrt(a * a + b * b);     // 勾股定理
 69     }
 70 
 71     public PointF countPoint(MotionEvent event) {
 72         float x = (event.getX(0) + event.getX(1)) / 2;     // x轴中间点
 73         float y = (event.getY(0) + event.getY(1)) / 2;     // y轴中间点
 74         return new PointF(x, y);
 75     }
 76 
 77     
 78     /*
 79     private class MyOnTouchListener implements OnTouchListener {
 80         private float x;
 81         private float y;
 82         private Matrix oldMatrix = new Matrix();
 83         private Matrix newMatrix = new Matrix();        // 用来操作图片的模型
 84 
 85         public boolean onTouch(View v, MotionEvent event) {
 86             switch (event.getAction()) {                // 判断触摸动作的类型
 87                 case MotionEvent.ACTION_DOWN:             // 按下时
 88                     x = event.getX();                     // 获取x轴坐标
 89                     y = event.getY();                    // 获取y轴坐标
 90                     oldMatrix.set(imageView.getImageMatrix());        // 用模型记住图片所在位置
 91                     break;
 92                 case MotionEvent.ACTION_MOVE:             // 移动时
 93                     newMatrix.set(oldMatrix);             // 用另一个模型记住按下时的位置
 94                     newMatrix.postTranslate(event.getX() - x, event.getY() - y);    // 移动模型
 95                     break;
 96             }
 97             imageView.setImageMatrix(newMatrix);        // 把图片放到了移动后的模型中
 98             return true;
 99         }
100     }
101     */
102     
103 }

 

posted on 2015-05-29 13:42  wf110  阅读(336)  评论(0编辑  收藏  举报