Android实现对imageview的拖动以及缩放


Android实现对imageview的拖动以及缩放

  1. package org.wch.gesture;  
  2.   
  3. import android.graphics.Matrix;    
  4. import android.graphics.PointF;    
  5. import android.util.FloatMath;    
  6. import android.util.Log;  
  7. import android.view.MotionEvent;    
  8. import android.view.View;    
  9. import android.view.View.OnTouchListener;    
  10. import android.widget.ImageView;    
  11. import android.widget.ImageView.ScaleType;    
  12.   
  13. public class MulitPointTouchListener implements OnTouchListener {    
  14.   
  15.     Matrix matrix = new Matrix();    
  16.     Matrix savedMatrix = new Matrix();    
  17.   
  18.     public ImageView image;    
  19.     static final int NONE = 0;    
  20.     static final int DRAG = 1;    
  21.     static final int ZOOM = 2;    
  22.     int mode = NONE;    
  23.   
  24.     PointF start = new PointF();    
  25.     PointF mid = new PointF();    
  26.     float oldDist = 1f;    
  27.   
  28.   
  29.     public MulitPointTouchListener(ImageView image) {    
  30.         super();    
  31.         this.image = image;    
  32.     }    
  33.   
  34.     @Override    
  35.     public boolean onTouch(View v, MotionEvent event) {    
  36.         this.image.setScaleType(ScaleType.MATRIX);    
  37.   
  38.         ImageView view = (ImageView) v;    
  39. //      dumpEvent(event);     
  40.   
  41.         switch (event.getAction() & MotionEvent.ACTION_MASK) {  
  42.           
  43.         case MotionEvent.ACTION_DOWN:    
  44.   
  45.             Log.w("FLAG""ACTION_DOWN");  
  46.             matrix.set(view.getImageMatrix());    
  47.             savedMatrix.set(matrix);    
  48.             start.set(event.getX(), event.getY());    
  49.             mode = DRAG;    
  50.             break;    
  51.         case MotionEvent.ACTION_POINTER_DOWN:    
  52.             Log.w("FLAG""ACTION_POINTER_DOWN");  
  53.             oldDist = spacing(event);    
  54.             if (oldDist > 10f) {    
  55.                 savedMatrix.set(matrix);    
  56.                 midPoint(mid, event);    
  57.                 mode = ZOOM;    
  58.             }    
  59.             break;    
  60.         case MotionEvent.ACTION_UP:    
  61.             Log.w("FLAG""ACTION_UP");  
  62.         case MotionEvent.ACTION_POINTER_UP:    
  63.             Log.w("FLAG""ACTION_POINTER_UP");  
  64.             mode = NONE;    
  65.             break;    
  66.         case MotionEvent.ACTION_MOVE:    
  67.             Log.w("FLAG""ACTION_MOVE");  
  68.             if (mode == DRAG) {    
  69.                 matrix.set(savedMatrix);    
  70.                 matrix.postTranslate(event.getX() - start.x, event.getY()    
  71.                         - start.y);    
  72.             } else if (mode == ZOOM) {    
  73.                 float newDist = spacing(event);    
  74.                 if (newDist > 10f) {    
  75.                     matrix.set(savedMatrix);    
  76.                     float scale = newDist / oldDist;    
  77.                     matrix.postScale(scale, scale, mid.x, mid.y);    
  78.                 }    
  79.             }    
  80.             break;    
  81.         }    
  82.   
  83.         view.setImageMatrix(matrix);    
  84.         return true;  
  85.     }    
  86.   
  87.       
  88.     private float spacing(MotionEvent event) {    
  89.         float x = event.getX(0) - event.getX(1);    
  90.         float y = event.getY(0) - event.getY(1);    
  91.         return FloatMath.sqrt(x * x + y * y);    
  92.     }    
  93.   
  94.     private void midPoint(PointF point, MotionEvent event) {    
  95.         float x = event.getX(0) + event.getX(1);    
  96.         float y = event.getY(0) + event.getY(1);    
  97.         point.set(x / 2, y / 2);    
  98.     }    
  99. }   

相关内容