/**
     * 自定义触摸事件
     * @author tian
     *
     */
	private class TouchListener implements OnTouchListener{
		 private PointF startPoint = new PointF();
	     private Matrix matrix = new Matrix();
	     private Matrix currentMaritx = new Matrix();
	     
	     private int mode = 0;//用于标记模式
	     private static final int DRAG = 1;//拖动
	     private static final int ZOOM = 2;//放大
	     private float startDis = 0;
	     private PointF midPoint;//中心点
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			// TODO Auto-generated method stub
			switch (event.getAction() & MotionEvent.ACTION_MASK)
			{
				case MotionEvent.ACTION_DOWN:
					mode = DRAG;
					currentMaritx.set(imageView.getImageMatrix());//记录ImageView当期的移动位置
					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);
									matrix.postScale(scale, scale, midPoint.x, midPoint.y);
								}
							}
					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;
			   }
			
				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);
			    }

posted on 2012-12-11 11:51  纯洁的坏蛋  阅读(179)  评论(0编辑  收藏  举报