首页 > 代码库 > onTouch与onClick冲突解决方法

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,否则会导致无法响应onClick11             break;12         case MotionEvent.ACTION_MOVE:13             lastX = event.getX();14             lastY = event.getY();15             16             //如果要处理滑动事件,要把事件设置为ACTION_CANCEL,否则会在滑动时触发onClick17             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 something22                 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冲突解决方法