onTouch 事件与onClick事件发生冲突,如何在onTouch事件中实现点击事件



最近几天在做一个瀑布流的小项目,为了实现以下功能:图片的手指放大、移动,点击后关闭当前的自定义窗口,无论怎么设置,ontouch事件和onclick就是发生冲突,无法实现想要功能,刚开始以为是手指放大移动功能的方法以及图片的获取问题,后来意识到是这两个方法发生了冲突。后来查找各种资料,终止解决了这个问题。处理方法:


取消onclick方法,定义两个变量 float x,float y,在case MotionEvent.ACTION_MOVE:中放入代码

 x = event.getX();
y = event.getY();

在case MotionEvent.ACTION_UP:加入下面代码,进行判断

if(x>5 || y>5){
x=y=0;
}else{
popWin.dismiss();//关闭自定义的窗口
}
break;


实现手指放大、移动,点击后关闭窗口的类如下:


public class ZoomListener implements OnTouchListener {
	float Ospace;
	PointF start = new PointF(0, 0);
	String Mode;
	private Swiper swp;
	private float x,y;
	private PopupWindow popWin;
	private MyView myView ;
	


	public ZoomListener(Context context,MyView myView) {
		this.myView = myView;
	}
	
	public ZoomListener(){}
	public ZoomListener(PopupWindow popWin,String[]  image_filenames,String path){
		this.popWin = popWin;
      
	}
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO 自动生成的方法存根

		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_DOWN:
			
			start.set(event.getX(), event.getY());
			
			Log.i("info", start.x + ":" + start.y);
			
			Mode = "DRAG";
			break;
		case MotionEvent.ACTION_POINTER_DOWN:
			Ospace = spacing(event);
			Mode = "ZOOM";
			Log.i("info", "原始面积" + Ospace);

			break;
		case MotionEvent.ACTION_UP:
			if(x>5 || y>5){
				x=y=0;
			}else{
				popWin.dismiss();
			}
			break;
		case MotionEvent.ACTION_POINTER_UP:
			Mode = "NONE";
			if(((MyView) v).getZoom() == 1){
				float sx = start.x - event.getX();
				float sy = start.y - event.getY();
				if (Math.abs(sx) > Math.abs(sy)) {
//					swp.Swipe(v, sx/10);
				}
			}
			start.set(event.getX(), event.getY());
			break;
		case MotionEvent.ACTION_MOVE:
			if (Mode == "DRAG") {
				
				if (((MyView) v).getZoom() > 1) {
					float sx = start.x - event.getX();
					float sy = start.y - event.getY();
					if(Math.sqrt(sx*sx+sy*sy)>20){
					((MyView) v).setPan((int) (start.x - event.getX()),
							(int) (start.y - event.getY()));
					Log.i("info", "平移:" + ((MyView) v).getPan().x + ":"
							+ ((MyView) v).getPan().y);
					start.set(event.getX(), event.getY());
					}
					
				} 
					

			} else if (Mode == "ZOOM") {
				float nspace = spacing(event);
				float zoom = 1 + (nspace - Ospace) / Ospace;
					if(Math.abs(nspace - Ospace)>3){
					((MyView) v).setZoom(zoom);
					Log.i("Info", "缩放为:" + ((MyView) v).getZoom());
					Ospace=nspace;
					}
				
			}
			x = event.getX();
			y = event.getY();
			break;
	
		}
		return true;
//		return detector.onTouchEvent(event);
	}

	private float spacing(MotionEvent event) {
		float x = event.getX(0) - event.getX(1);
		float y = event.getY(0) - event.getY(1);
		return FloatMath.sqrt(x * x + y * y);
	}

	public Swiper getSwp() {
		return swp;
	}

	public void setSwp(Swiper swp) {
		this.swp = swp;
	}

	public interface Swiper {
		public void Swipe(View v, float length);
	}
	


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值