实现的效果如图:
代码如下
public class XImageView extends ImageView {
public XImageView(Context context) {
super(context);
init();
}
public XImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private static final int MODE_DRAG = 1;
private static final int MODE_ZOOM = 2;
private int mode;
private Matrix matrix;
private Point lastPoint;
private float lastDis;
private Point center;
private void init() {
lastPoint = new Point();
center = new Point();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
matrix = getImageMatrix();
lastPoint.set((int) event.getX(), (int) event.getY());
mode = MODE_DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
lastDis = getDistance(event);
if (lastDis > 10) {
mode = MODE_ZOOM;
getCenter(event);
}
break;
case MotionEvent.ACTION_MOVE:
switch (mode) {
case MODE_DRAG:
int x = (int) event.getX();
int y = (int) event.getY();
matrix.postTranslate(x - lastPoint.x, y - lastPoint.y);
lastPoint.set(x, y);
break;
case MODE_ZOOM:
float newDis = getDistance(event);
if (Math.abs(newDis - lastDis) <= 10) {
} else if (newDis > 20) {
float sc = newDis / lastDis;
matrix.postScale(sc, sc, center.x, center.y);
lastDis = newDis;
}
break;
}
invalidate();
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
/**
* 获取两个触控点之间的距离
*
* @param event
* @return
*/
private float getDistance(MotionEvent event) {
return (float) Math.sqrt(Math.pow(event.getX(0) - event.getX(1), 2) + Math.pow(event.getY(0) - event.getY(1), 2));
}
/**
* 获取缩放中心点
*
* @param event
*/
private void getCenter(MotionEvent event) {
int x = (int) ((event.getX(0) + event.getX(1)) / 2);
int y = (int) ((event.getY(0) + event.getY(1)) / 2);
center.set(x, y);
}
}