package cn.itcast.drag; import android.app.Activity; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class MainActivity extends Activity { private ImageView imageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageView = (ImageView) this.findViewById(R.id.imageView); imageView.setOnTouchListener(new TouchListener()); } private final class TouchListener implements OnTouchListener{ private PointF startPoint = new PointF(); private Matrix matrix = new Matrix(); private Matrix currentMatrix = new Matrix(); //存放当前照片的移动位置 private int mode = 0; private static final int DRAG = 1; private static final int ZOOM = 2; private float startDis;//拉拽前距离 private PointF midPoint;//中间点坐标 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN://手指压屏幕 mode = DRAG; currentMatrix.set(imageView.getImageMatrix());//记录imageView当前的移动位置 startPoint.set(event.getX(), event.getY()); break; //核心事件,其他为辅助的设置事件 case MotionEvent.ACTION_MOVE://手指在屏幕上移动 if(mode == DRAG){ float dx = event.getX() - startPoint.x;//得到在X轴上的移动距离 float dy = event.getY() - startPoint.y;//得到在y轴上的移动距离 matrix.set(currentMatrix);//在上一次位置没有进行移动时的位置(一定要在设置了当前的位置后,并在此基础上进行移动) matrix.postTranslate(dx, dy);//拓展到该坐标 }else if(mode == ZOOM){//缩放模式 float endDis = distance(event);//拉拽后距离 if(endDis > 10f){ float scale = endDis / startDis;//缩放倍数 matrix.set(currentMatrix); matrix.postScale(scale, scale, midPoint.x, midPoint.y); } } break; case MotionEvent.ACTION_UP://手指从屏幕抬起 case MotionEvent.ACTION_POINTER_UP://在屏幕上已有一根手指按屏幕后,再有一根手指按屏 mode = 0; break; case MotionEvent.ACTION_POINTER_DOWN://在屏幕上有两根手指按屏幕后,其中有一根手从屏幕抬起 mode = ZOOM; startDis = distance(event);//开始距离 if(startDis > 10f){ midPoint = mid(event); currentMatrix.set(imageView.getImageMatrix());//记录imageView当前的移动位置 } break; } imageView.setImageMatrix(matrix); return true; } } /** * 计算两点间的距离 * @param event * @return */ public static float distance(MotionEvent event) { float dx = event.getX(1) - event.getX(0); //getX(1):后一个按下去的点的坐标,getX(0):前一个按下去的点的坐标 float dy = event.getY(1) - event.getY(0); return FloatMath.sqrt(dx*dx + dy*dy); } /** * 计算中心点位置 * @param event * @return */ public static PointF mid(MotionEvent event){ float midX = (event.getX(1) + event.getX(0)) / 2; float midY = (event.getY(1) + event.getY(0)) / 2; return new PointF(midX, midY); } }