Android之实现手势缩放ImageView

来源:互联网 发布:淘宝好评返现违规补救 编辑:程序博客网 时间:2024/05/13 02:17

将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListener。
例如:imageView.setOnTouchListener(new MulitPointTouchListener ());

在xml中要将ImageView的缩放格式改成Matrix

例如:android:scaleType="matrix"

这样就可以实现图片的缩放了

 

下面是MulitPointTouchListener.java代码:

  1. public class MulitPointTouchListener implements OnTouchListener {     
  2.         private static final String TAG = "Touch";     
  3.         // These matrices will be used to move and zoom image     
  4.         Matrix matrix = new Matrix();     
  5.         Matrix savedMatrix = new Matrix();     
  6.     
  7.         // We can be in one of these 3 states     
  8.         static final int NONE = 0;     
  9.         static final int DRAG = 1;     
  10.         static final int ZOOM = 2;     
  11.         int mode = NONE;     
  12.     
  13.         // Remember some things for zooming     
  14.         PointF start = new PointF();     
  15.         PointF mid = new PointF();     
  16.         float oldDist = 1f;     
  17.     
  18.         @Override    
  19.         public boolean onTouch(View v, MotionEvent event) {     
  20.     
  21.                 ImageView view = (ImageView) v;     
  22.                 // Log.e("view_width",     
  23.                 // view.getImageMatrix()..toString()+"*"+v.getWidth());     
  24.                 // Dump touch event to log     
  25.                 dumpEvent(event);     
  26.     
  27.                 // Handle touch events here...     
  28.                 switch (event.getAction() & MotionEvent.ACTION_MASK) {     
  29.                 case MotionEvent.ACTION_DOWN:     
  30.     
  31.                         matrix.set(view.getImageMatrix());     
  32.                         savedMatrix.set(matrix);     
  33.                         start.set(event.getX(), event.getY());     
  34.                         //Log.d(TAG, "mode=DRAG");     
  35.                         mode = DRAG;     
  36.     
  37.                             
  38.                         //Log.d(TAG, "mode=NONE");     
  39.                         break;     
  40.                 case MotionEvent.ACTION_POINTER_DOWN:     
  41.                         oldDist = spacing(event);     
  42.                         //Log.d(TAG, "oldDist=" + oldDist);     
  43.                         if (oldDist > 10f) {     
  44.                                 savedMatrix.set(matrix);     
  45.                                 midPoint(mid, event);     
  46.                                 mode = ZOOM;     
  47.                                 //Log.d(TAG, "mode=ZOOM");     
  48.                         }     
  49.                         break;     
  50.                 case MotionEvent.ACTION_UP:     
  51.                 case MotionEvent.ACTION_POINTER_UP:     
  52.                         mode = NONE;     
  53.                         //Log.e("view.getWidth", view.getWidth() + "");     
  54.                         //Log.e("view.getHeight", view.getHeight() + "");     
  55.     
  56.                         break;     
  57.                 case MotionEvent.ACTION_MOVE:     
  58.                         if (mode == DRAG) {     
  59.                                 // ...     
  60.                                 matrix.set(savedMatrix);     
  61.                                 matrix.postTranslate(event.getX() - start.x, event.getY()     
  62.                                                 - start.y);     
  63.                         } else if (mode == ZOOM) {     
  64.                                 float newDist = spacing(event);     
  65.                                 //Log.d(TAG, "newDist=" + newDist);     
  66.                                 if (newDist > 10f) {     
  67.                                         matrix.set(savedMatrix);     
  68.                                         float scale = newDist / oldDist;     
  69.                                         matrix.postScale(scale, scale, mid.x, mid.y);     
  70.                                 }     
  71.                         }     
  72.                         break;     
  73.                 }     
  74.     
  75.                 view.setImageMatrix(matrix);     
  76.                 return true// indicate event was handled     
  77.         }     
  78.     
  79.         private void dumpEvent(MotionEvent event) {     
  80.                 String names[] = { "DOWN""UP""MOVE""CANCEL""OUTSIDE",     
  81.                                 "POINTER_DOWN""POINTER_UP""7?""8?""9?" };     
  82.                 StringBuilder sb = new StringBuilder();     
  83.                 int action = event.getAction();     
  84.                 int actionCode = action & MotionEvent.ACTION_MASK;     
  85.                 sb.append("event ACTION_").append(names[actionCode]);     
  86.                 if (actionCode == MotionEvent.ACTION_POINTER_DOWN     
  87.                                 || actionCode == MotionEvent.ACTION_POINTER_UP) {     
  88.                         sb.append("(pid ").append(     
  89.                                         action >> MotionEvent.ACTION_POINTER_ID_SHIFT);     
  90.                         sb.append(")");     
  91.                 }     
  92.                 sb.append("[");     
  93.                 for (int i = 0; i < event.getPointerCount(); i++) {     
  94.                         sb.append("#").append(i);     
  95.                         sb.append("(pid ").append(event.getPointerId(i));     
  96.                         sb.append(")=").append((int) event.getX(i));     
  97.                         sb.append(",").append((int) event.getY(i));     
  98.                         if (i + 1 < event.getPointerCount())     
  99.                                 sb.append(";");     
  100.                 }     
  101.                 sb.append("]");     
  102.                 //Log.d(TAG, sb.toString());     
  103.         }     
  104.     
  105.             
  106.         private float spacing(MotionEvent event) {     
  107.                 float x = event.getX(0) - event.getX(1);     
  108.                 float y = event.getY(0) - event.getY(1);     
  109.                 return FloatMath.sqrt(x * x + y * y);     
  110.         }     
  111.     
  112.             
  113.         private void midPoint(PointF point, MotionEvent event) {     
  114.                 float x = event.getX(0) + event.getX(1);     
  115.                 float y = event.getY(0) + event.getY(1);     
  116.                 point.set(x / 2, y / 2);     
  117.         }     
  118. }