public class MulitPointTouchListener implements OnTouchListener {

		Matrix matrix = new Matrix();
		Matrix savedMatrix = new Matrix();

		public ImageView image;
		static final int NONE = 0;
		static final int DRAG = 1;
		static final int ZOOM = 2;
		int mode = NONE;

		PointF start = new PointF();
		PointF mid = new PointF();
		float oldDist = 1f;

		public MulitPointTouchListener(ImageView image) {
			super();
			this.image = image;
		}

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			this.image.setScaleType(ScaleType.MATRIX);

			ImageView view = (ImageView) v;
			// dumpEvent(event);

			switch (event.getAction() & MotionEvent.ACTION_MASK) {

			case MotionEvent.ACTION_DOWN:

				Log.w("FLAG", "ACTION_DOWN");
				matrix.set(view.getImageMatrix());
				savedMatrix.set(matrix);
				start.set(event.getX(), event.getY());
				mode = DRAG;
				break;
			case MotionEvent.ACTION_POINTER_DOWN:
				Log.w("FLAG", "ACTION_POINTER_DOWN");
				oldDist = spacing(event);
				if (oldDist > 10f) {
					savedMatrix.set(matrix);
					midPoint(mid, event);
					mode = ZOOM;
				}
				break;
			case MotionEvent.ACTION_UP:
				Log.w("FLAG", "ACTION_UP");
			case MotionEvent.ACTION_POINTER_UP:
				Log.w("FLAG", "ACTION_POINTER_UP");
				mode = NONE;
				break;
			case MotionEvent.ACTION_MOVE:
				Log.w("FLAG", "ACTION_MOVE");
				if (mode == DRAG) {
					matrix.set(savedMatrix);
					matrix.postTranslate(event.getX() - start.x, event.getY()
							- start.y);
				} else if (mode == ZOOM) {
					float newDist = spacing(event);
					if (newDist > 10f) {
						matrix.set(savedMatrix);
						float scale = newDist / oldDist;
						matrix.postScale(scale, scale, mid.x, mid.y);
					}
				}
				break;
			}

			view.setImageMatrix(matrix);
			return true;
		}

		private float spacing(MotionEvent event) {
			float x = event.getX(0) - event.getX(1);
			float y = event.getY(0) - event.getY(1);
			return FloatMath.sqrt(x * x + y * y);
		}

		private void midPoint(PointF point, MotionEvent event) {
			float x = event.getX(0) + event.getX(1);
			float y = event.getY(0) + event.getY(1);
			point.set(x / 2, y / 2);
		}
	}

iv = (ImageView) findViewById(R.id.iv); 
iv.setOnTouchListener(new MulitPointTouchListener(iv)); 
iv.setScaleType(ScaleType.CENTER_INSIDE);

=======大图浏览

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/img"
android:scaleType="center"
android:background="#fff"
android:src="@drawable/picName"
/>
public void onCreate(Bundle savedInstanceState)
			{
				super.onCreate(savedInstanceState);
				setContentView(R.layout.xml_name_layout);
				final ImageView switcherView = (ImageView) this.findViewById(R.id.img);
				switcherView.setOnTouchListener(new View.OnTouchListener()
					{
						public boolean onTouch(View arg0, MotionEvent event)
							{
								float curX, curY;
								switch (event.getAction())
									{
									case MotionEvent.ACTION_DOWN:
										mx = event.getX();
										my = event.getY();
										break;
									case MotionEvent.ACTION_MOVE:
										curX = event.getX();
										curY = event.getY();
										switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
										mx = curX;
										my = curY;
										break;
									case MotionEvent.ACTION_UP:
										curX = event.getX();
										curY = event.getY();
										switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
										break;
									}
								return true;
							}
					});
			}
参见:1/2