Android:利用Matrix,实现双手指缩放图片与拖拽图片功能

import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {
	ImageView imageView;
	private PointF startPoint = new PointF();
	private Matrix matrix = new Matrix();
	private Matrix currentMaritx = new Matrix();
	boolean firstTimeZoom = true;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		imageView = (ImageView) findViewById(R.id.imageView);
		imageView.setOnTouchListener(new TounchListener());
	}

	private class TounchListener implements OnTouchListener {

		private int mode = 0;// 用于标记模式
		private static final int DRAG = 1;// 拖动
		private static final int ZOOM = 2;// 放大
		private float startDis = 0;

		// private PointF midPoint;// 中心点

		public boolean onTouch(View v, MotionEvent event) {
			switch (event.getAction() & MotionEvent.ACTION_MASK) {
			case MotionEvent.ACTION_DOWN:
				mode = DRAG;
				imageView.setScaleType(ImageView.ScaleType.MATRIX);//设置ImageView的缩放模式为矩阵缩放
				currentMaritx.set(imageView.getImageMatrix());// 记录ImageView当期的移动位置
				if(firstTimeZoom){
					currentMaritx.postScale(1, 1);
					firstTimeZoom = false;
				}
				startPoint.set(event.getX(), event.getY());// 开始点
				break;
			case MotionEvent.ACTION_MOVE:// 移动事件
				if (mode == DRAG) {// 图片拖动事件
					float dx = event.getX() - startPoint.x;// x轴移动距离
					float dy = event.getY() - startPoint.y;
					matrix.set(currentMaritx);// 在当前的位置基础上移动
					matrix.postTranslate(dx, dy);

				} else if (mode == ZOOM) {// 图片放大事件
					float endDis = distance(event);// 结束距离
					if (endDis > 10f) {
						float scale = endDis / startDis;// 放大倍数
						matrix.set(currentMaritx);
						float currentX = imageView.getWidth() / 2;
						float currentY = imageView.getHeight() / 2;
						matrix.postScale(scale, scale, currentX, currentY);
					}

				}
				break;

			case MotionEvent.ACTION_UP:
				mode = 0;
				break;
			// 有手指离开屏幕,但屏幕还有触点(手指)
			case MotionEvent.ACTION_POINTER_UP:
				mode = 0;
				break;
			// 当屏幕上已经有触点(手指),再有一个手指压下屏幕
			case MotionEvent.ACTION_POINTER_DOWN:
				mode = ZOOM;
				startDis = distance(event);

				if (startDis > 10f) {// 避免手指上有两个茧
					// midPoint = mid(event);
					currentMaritx.set(imageView.getImageMatrix());// 记录当前的缩放倍数
				}

				break;

			}
			// Log.i("x", "");
			imageView.setImageMatrix(matrix);
			return true;
		}

	}

	/**
	 * 两点之间的距离
	 * 
	 * @param event
	 * @return
	 */
	private static float distance(MotionEvent event) {
		// 两根线的距离
		float dx = event.getX(1) - event.getX(0);
		float dy = event.getY(1) - event.getY(0);
		return FloatMath.sqrt(dx * dx + dy * dy);
	}

	/**
	 * 计算两点之间中心点的距离
	 * 
	 * @param event
	 * @return
	 */
	// private static PointF mid(MotionEvent event) {
	// float midx = event.getX(1) + event.getX(0);
	// float midy = event.getY(1) - event.getY(0);
	// return new PointF(midx / 2, midy / 2);
	// }
}

这个例子做的还不够完整,有一些功能没有实现,而且有时还会出现一些bug。

我是用安卓2.3.5版本测试的,如果在onCreate方法中设置图片的初始缩放为比例为1的话,并不能产生效果,只有把缩放语句放在onTouch方法里才会有效,不太理解是怎么原理,希望大家能给些意见。

 

如果想了解ImageView的属性android:scaleType作用,可以去看大神的博客,地址为 http://blog.csdn.net/dyllove98/article/details/8827697

 

代码下载地址为 http://download.csdn.net/detail/u012251822/6389653

你可能感兴趣的:(Android:利用Matrix,实现双手指缩放图片与拖拽图片功能)