布局:
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="matrix"
android:src="@drawable/i" />
mainactivity:
public class MainActivity extends AppCompatActivity { private final int MODE_DRAG = 1; private final int MODE_ZOOM = 2; private final int MODE_NONE = 0; private ImageView imageView; private int currentMode = MODE_NONE; private double distanceStart; private float xl; private float yl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.imageView); initView(); } Matrix matrix = new Matrix(); Matrix matrixNew = new Matrix(); private void initView() { imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: currentMode = MODE_DRAG; xl = event.getX(); yl = event.getY(); matrix.set(imageView.getImageMatrix()); break; case MotionEvent.ACTION_POINTER_DOWN: distanceStart = spacing(event); if (distanceStart > 20) { currentMode = MODE_ZOOM; matrix.set(imageView.getImageMatrix()); } break; case MotionEvent.ACTION_MOVE: if (currentMode == MODE_DRAG) { matrixNew.set(matrix); float xn = event.getX(); float yn = event.getY(); //matrix.setTranslate(xn,yn); matrixNew.postTranslate(xn - xl, yn - yl); } else if (currentMode == MODE_ZOOM) { double distance = spacing(event); float scale = (float) (distance / distanceStart); PointF pointF = midPoint(event); matrixNew.postScale(scale, scale, pointF.x, pointF.y); } break; case MotionEvent.ACTION_UP: currentMode = MODE_NONE; break; } imageView.setImageMatrix(matrixNew); return true; } }); } //计算两点之间的距离 private double spacing(MotionEvent event) { float x = 0; float y = 0; try { x = event.getX(0) - event.getX(1); y = event.getY(0) - event.getY(1); } catch (IllegalArgumentException e) { } return Math.sqrt(x * x + y * y); } public PointF midPoint(MotionEvent event) { float x0 = event.getX(0); float x1 = event.getX(1); float y0 = event.getX(0); float y1 = event.getX(1); float x = (x0 + x1) / 2; float y = (y0 + y1) / 2; PointF pointF = new PointF(x, y); return pointF; } }