android 图片缩放

一、实现步骤

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值