手指多点触控事件
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 }