现在的位置: 首页 > 综合 > 正文

android手势缩放

2013年10月17日 ⁄ 综合 ⁄ 共 2390字 ⁄ 字号 评论关闭
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 {
	private ImageView meImageView;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		initView();
	}

	/**
	 * 初始化 View
	 * 
	 * @date 2012-3-2 下午10:35:28
	 */
	private void initView() {
		meImageView = (ImageView) findViewById(R.id.iv_me);//放图片的ImageView
		meImageView.setOnTouchListener(new myTouchListener());//为图片设置监听
	}
	/**
	 * 处理触摸事件  
	 * @author 小袁
	 * @date 2012-3-2 下午10:38:36
	 */
	private class myTouchListener implements OnTouchListener {
		private PointF startPoint = new PointF();//移动前手指点击的坐标
		private PointF midPoint = new PointF();//移动前手指点击的坐标
		private Matrix matrix = new Matrix();//矩阵
		private Matrix currentMatrix = new Matrix();//每次缩放前都需要存储当前的矩阵
		private final static int DRAG = 1;//移动的标志
		private final static int ZOOM = 1;//缩放的标志
		private int type = 0;//代表当前状态
		private float startDist = 0;//开始时的距离
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			// TODO Auto-generated method stub
			switch (event.getAction() & MotionEvent.ACTION_MASK) {//屏蔽掉高8位  因为没用 可能会提高效率
			case MotionEvent.ACTION_DOWN://一个手指按下事件
				startPoint.set(event.getX(),event.getY());//起点的坐标
				currentMatrix.set(matrix);//每一次存储当前的矩阵
				type = DRAG;//这个代表移动
				break;
			case MotionEvent.ACTION_MOVE:
				if ( type == DRAG) {//如果是移动的事件
					float dx = event.getX() - startPoint.x;//x轴移动的距离
					float dy = event.getY() - startPoint.y;//y轴移动的距离
					matrix.set(currentMatrix);
					matrix.postTranslate(dx, dy);
				}else if (type == ZOOM) {//如果是缩放的事件
					float dist = distance(event);
					if (dist > 10f) {
						matrix.set(currentMatrix);
						float scale = dist / startDist;
						matrix.postScale(scale, scale, midPoint.x, midPoint.y);
					}
				}
				break;
			case MotionEvent.ACTION_POINTER_DOWN://第二个手指
				startDist = distance(event);//两个手指之间的距离
				if (startDist > 10f) {
					currentMatrix.set(matrix);
					type = ZOOM;
					midPoint = midPoint(event);
				}
				break;
			case MotionEvent.ACTION_UP:
				break;
			case MotionEvent.ACTION_POINTER_UP:
				 type = 0;//弹起来初始化
				break;
			default:
				break;
			}
			meImageView.setImageMatrix(matrix); 
			return true;
		}
		private 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);
		}
		private PointF midPoint(MotionEvent event){
			float x = (event.getX(1) + event.getX(0)) / 2;
			float y = (event.getY(1) + event.getY(0)) / 2;
			return new PointF(x,y);
		}
	}
}

//......

抱歉!评论已关闭.