Android之实现手势缩放ImageView

原文地址:http://blog.csdn.net/weidi1989/article/details/8477786

将以下代码写到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. }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值