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_* 

 

转载于:https://www.cnblogs.com/rabbit-ak-star/p/5941366.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值