一、实现步骤
1、在touch down的时候,记录两个手指头的初始距离,记录初始 比例
2、在move的时候,通过现在的距离除以初始距离,算出缩放比例。缩放比例乘以初始比例,就是当前比例
3、设置图片矩阵的scale和translate。设置的原理如下图:
1) bitmap矩阵先放缩到和ImageView一样大
2)移bitmap矩阵到和ImageView 重合
二、源码
public class MyImageView extends ImageView {
private static final int MIN_DISTANCE = 10;
private Matrix mMatrix = new Matrix();
private float mStartRatio;
private float mStartDis;
public Bitmap mImageBitmap;
public float mRatio;
public float mInitRadio;
public MyImageView(Context context) {
super(context);
setScaleType(ScaleType.MATRIX);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if (mStartDis < MIN_DISTANCE)
break;
float endDis = distance(event);
if (endDis > 10f) {
float ratio = endDis / mStartDis;
mRatio = mStartRatio * ratio;
refreshMatrix();
}
break;
case MotionEvent.ACTION_UP:
if (mRatio < mInitRadio) {
mRatio = mInitRadio;
refreshMatrix();
}
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
cancelLongPress();
initStartDistance(event);
break;
}
return super.onTouchEvent(event);
}
private void initStartDistance(MotionEvent event) {
mStartDis = distance(event);
if (mStartDis > MIN_DISTANCE) {
mStartRatio = mRatio;
}
}
private float distance(MotionEvent event) {
if (event.getPointerCount() < 2)
return 0;
float dx = event.getX(1) - event.getX(0);
float dy = event.getY(1) - event.getY(0);
return FloatMath.sqrt(dx * dx + dy * dy);
}
@Override
public void setImageBitmap(Bitmap imageBitmap) {
if (mImageBitmap != null
&& mImageBitmap != imageBitmap) {
mImageBitmap.recycle();
mImageBitmap = null;
}
mImageBitmap = imageBitmap;
super.setImageBitmap(imageBitmap);
}
public void initImageMatrix(int width, int height) {
float xRatio = (float) width / mImageBitmap.getWidth();
float yRatio = (float) height
/ mImageBitmap.getHeight();
mRatio = xRatio < yRatio ? xRatio : yRatio;
mInitRadio = mRatio;
refreshMatrix(width, height);
}
private void refreshMatrix() {
refreshMatrix(getWidth(), getHeight());
}
private void refreshMatrix(int width, int height) {
mMatrix.reset();
mMatrix.postScale(mRatio, mRatio,
mImageBitmap.getWidth() / 2,
mImageBitmap.getHeight() / 2);
mMatrix.postTranslate(
(width - mImageBitmap.getWidth()) / 2,
(height - mImageBitmap.getHeight()) / 2);
setImageMatrix(mMatrix);
}
}