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

时间: 2024-11-03 13:03:37

onTouch与onClick冲突解决方法的相关文章

双击和单击事件冲突解决方法

双击和单击事件冲突解决方法:关于单击事件和双击事件,如果单独拿出来都是非常简单,这里也就不多介绍了,具体可以参阅jQuery的click事件和jQuery的dblclick事件一章节,但是如果同一个元素同时绑定了单击事件和双击事件,那么就会造成冲突现象,比如我们双击此元素指向触发双击事件,但是也完全满足单击事件的条件,不但双击事件触发了,单击事件同样也会被触发,下面就通过代码实例介绍一下如何解决它们的冲突问题,代码如下: <!DOCTYPE html> <html> <hea

apache与IIS共用80端口冲突解决方法

如果同一台电脑安装了apache和iis,会提示80端口冲突,如何解决apache与iis 80端口冲突的问题呢,并且同时使用apache和iis 将apache设为使用80端口,IIS使用其它端口,比如81,然后将apache作为IIS的代理. 在httpd.conf里面,取消下面四行的注释: LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connec

SVN冲突解决方法

SVN冲突解决方法     遇到种情况,首先,你要冷静 我们来分析一下产生冲突额原因!(模拟一下) 我们将一个名为CODE.txt的文件上传到svn服务中,内容如下: 然后你的小伙伴check out下来改成了: “hello world! 今天是21号” 接着就commit(svn上的最新版本就是这个了) 接着,你又check out下来改成了: “hello world! 今天是22号” 当你commit的时候,就---------- 冷静 你打开原来的原文件夹会发现

[转载]CSS&lt;a href&gt;链接样式冲突解决方法!

给自己这个初学者看的! 原文地址:CSS<a  href>链接样式冲突解决方法!作者:叶朗 这里我简要的说一下:关于a href样式冲突 首先我有一个外部CSS样式文件(index.css)里面直接用a:link a:active直接写了 而网站首页和其他栏目页都调用<link href="css/index.css" rel="stylesheet" type="text/css" />,但是我想再在首页加上新的链接并且

java jar包冲突解决方法

jar包冲突几乎是每个java程序员都会遇到的问题,而且特别是大工程,jar包各种依赖,经常性发生包冲突.通常会报这样几个运行时异常: java.lang.NoSuchMehodError java.lang.NoClassDefFoundError 这类问题十有八九都是jar包冲突引起,要解决jar包冲突问题,我们先了解下导致这个冲突的原因. 导致jar包冲突的原因 1.mvn的传递依赖特性:mvn编译打包除了会引入直接申明的依赖,还会引入间接申明的依赖 2.mvn的依赖仲裁规则: 1). 按

Genymotion模拟器adb冲突解决方法

在使用AndroidStudio过程中,难免会碰到adb冲突的情况,下面介绍2中ADB冲突的情况: 情况1:AndroidStudio和Genymotion连接不上 解决方法:首先排除各种手机助手是否有卸载:其次驱动人生和驱动精灵也会造成adb连接不上. 情况2:AndroidStudio与Genymotion能连接上,但用cmd操作adb命令时出现如下报错提示:error: could not install smartsocket listener: cannot bind to 127.0

OC中自定义属性与系统属性冲突解决方法

Xcode中经常我们自己定义的一些属性会和系统的某些属性冲突,坑爹的是你根本不知道系统的这个属性到底是什么玩意,并且编译器还会报警告,对于有强迫症的同学来说,太折磨了.下面提供一个解决方法: 编译器警告: Auto property synthesis will not synthesize property 'description' 这是说编译器自动给你自定义的属性合成getter和setter的时候将会在它的父类上实现,而你会一脸懵逼不知道咋回事,其实只要添加 @dynamic告诉编译器这

tomcat web工程 jar包冲突解决方法

目前在部署工程时,遇到了一个问题,报错信息如下: See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 经检测,是工程包中含有javax.servlet包的JAR包,造成与Tomcat自身的servlet-api.jar的冲突. 1.问题的原因: tomcat 启动后先将tomcat/common/lib目录下的jar包全部读入内存,如果webapps目录里的应用程序中WEB-INF/l

jQuery中noConflict()机制的冲突解决方法

许多的JS框架类库都选择使用$符号作为函数或变量名,而且在实际的项目开发中,使用模板语言的话有可能"$"符号即为该模板语言的关键字.例如Veclocity模板语言,$是关键字.与jQuery一起使用可能会存在冲突(页面中直接写jq代码,引入的js文件不存在该问题). jQuery是使用$符号作为函数或变量名最为典型的一个.在jQuery中,$符号只是window.jQuery对象的一个引用,因此即使$被删除,jQuery依然能保证整个类库的完整性. jQuery的设计充分考虑了多框架之