android 图片缩放

来源:互联网 发布:python ui automation 编辑:程序博客网 时间:2024/05/15 17:19

一、实现步骤

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);}@Overridepublic 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);}@Overridepublic 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);}}

0 0