onTouch与onClick冲突解决方法
Posted AK-Star
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了onTouch与onClick冲突解决方法相关的知识,希望对你有一定的参考价值。
1 view.setOnTouchListener(new OnTouchListener() { 2 3 @Override 4 public boolean onTouch(View v, MotionEvent event) { 5 // TODO Auto-generated method stub 6 switch(event.getAction()){ 7 case MotionEvent.ACTION_DOWN: 8 firstX = event.getX(); 9 firstY = event.getY(); 10 //这里不能 return true,否则会导致无法响应onClick 11 break; 12 case MotionEvent.ACTION_MOVE: 13 lastX = event.getX(); 14 lastY = event.getY(); 15 16 //如果要处理滑动事件,要把事件设置为ACTION_CANCEL,否则会在滑动时触发onClick 17 if(dispose move event){ 18 MotionEvent cancelEvent = MotionEvent.obtain(event); 19 cancelEvent.setAction(MotionEvent.ACTION_CANCEL|(event.getActionIndex()<< MotionEvent.ACTION_POINTER_INDEX_SHIFT)); 20 v.onTouchEvent(cancelEvent); 21 //do something 22 cancelEvent.recycle(); 23 //return true表示要处理move事件 24 return true; 25 } 26 27 break; 28 case MotionEvent.ACTION_UP: 29 return false; 30 31 } 32 return v.onTouchEvent(event); 33 } 34 });
关键代码
1 MotionEvent cancelEvent = MotionEvent.obtain(event); 2 cancelEvent.setAction(MotionEvent.ACTION_CANCEL|(event.getActionIndex()<< MotionEvent.ACTION_POINTER_INDEX_SHIFT)); 3 v.onTouchEvent(cancelEvent);
MotionEvent.ACTION_CANCEL 不就可以实现取消操作为什么还要加上 |(event.getActionIndex()<< MotionEvent.ACTION_POINTER_INDEX_SHIFT) ?
主要是防止多点操作,这种情况下会进入 MotionEvent.ACTION_POINTER_* 而不是 MotionEvent.ACTION_*
以上是关于onTouch与onClick冲突解决方法的主要内容,如果未能解决你的问题,请参考以下文章
如何为可移动的浮动按钮设置 onTouch 和 onClick 功能