1)、按下按钮,不滑动,触发按钮功能

(2)、按下按钮,滑动触发滑动事件

这里的按下包含长按和短按情况

首先要解决这个问题需要明白Android中的Touch事件是如何进行处理的,这里有一篇文章:Android中Touch事件的处理逻辑_jwzhangjie的专栏-CSDN博客  里面详细介绍了Touch事件处理方法,总结性语句:

当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由  dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。

注意:

(1)、当滑动的时候,你不一定能正好移动合适的位置,这个时候就需要使用smoothScrollTo一类的功能函数来调整位置,而smoothScrollTo调用的时候,最好放在Handler里面实现--问题:当手慢慢移动按钮然后松开会出现异常,不过让你快速移动按钮,然后松开,按钮自己滑动停止不会有问题。

(2)、一般来说我们把一个按钮加上它前面的空白作为一组,滑动停止的时候,通过 getScrollX()来获取你当前滑动的位置,这样就可以计算你滑动停止的位置是否适合,如果不适合通过smoothScrollTo来调整,这里我用AppInforToSystem.bottom_btn_scroll_range作为一组的长度,方法如下:

public void checkRange(int value){try {if (value <= AppInforToSystem.bottom_btn_scroll_range / 2) {value = 0;smoothScrollTo(0, 0);AppInforToSystem.bottom_btn_scroll_flag = 2;}else if (value >= (diff_scroll - AppInforToSystem.bottom_btn_scroll_range / 2)) {smoothScrollTo(diff_scroll, 0);AppInforToSystem.bottom_btn_scroll_flag = 1;}else {int val = value / AppInforToSystem.bottom_btn_scroll_range;int diff = value % AppInforToSystem.bottom_btn_scroll_range;if (diff < AppInforToSystem.bottom_btn_scroll_range / 2) {smoothScrollTo(AppInforToSystem.bottom_btn_scroll_range * val, 0);}else {smoothScrollTo(AppInforToSystem.bottom_btn_scroll_range * (val+1), 0);}AppInforToSystem.bottom_btn_scroll_flag = 0;}this.computeScroll();} catch (Exception e) {AppInforToSystem.bottom_btn_scroll_flag = 0;}}

更需要注意的是里面this.computeScroll();一定要加上,不然会出现按钮和上面的文字分离的现象,

(3)、

View view = (View) this.getChildAt(this.getChildCount() - 1);
diff_scroll = view.getRight() - getWidth();//初始状态为0,没有滚动,如果滚动到右边,则等于subViewWidth - width

HorizontalScrollView只能有一个子孩子,所以要实现滑动多个组件的时候,需要使用LinearLayout或者RelativeLayout.

上面的diff_scroll就是你能够滑动的最大距离

(4)、如何检测滑动事件呢

我们需要实现一个类来继承HorizontalScrollView,并且重写onTouchEvent,当在ACTION_DOWN和ACTION_MOVE检测滑动事件并作相应处理

case MotionEvent.ACTION_DOWN:if(AppInforToSystem.bottom_btn_scroll_flag != 3){AppInforToSystem.bottom_btn_scroll_flag = 3;AppConnect.getInstance().callBack(CustomerInterface.MESSAGE_SCROLL_LR_FLAG);}case MotionEvent.ACTION_MOVE:if(AppInforToSystem.bottom_btn_scroll_flag != 3){AppInforToSystem.bottom_btn_scroll_flag = 3;AppConnect.getInstance().callBack(CustomerInterface.MESSAGE_SCROLL_LR_FLAG);}break;

有的人会问为什么在ACTION_DOWN检测了还要在ACTION_MOVE进行检测,这个你就需要之前那篇文章里面的内容,Touch事件会一直传递到子view上面,所以不会触发HorizontalScrollView的ACTION_DOWN事件,如果你移动按钮,首先出发的是按钮的MOVE事件,如果你移动幅度大的话就会触发HorizontalScrollView的ACTION_MOVE事件

所以我们需要在这两个事件都要检测

(5)、有的按钮功能是按下实现,松开关闭,这种情况就要用到onInterceptTouchEvent,让它返回false,不拦截这个事件,你可以设置一个变量,当要实现这种功能的按你按下去的时候,设置变量AppInforToSystem.main_touch_flag为0,而在onInterceptTouchEvent检测到AppInforToSystem.main_touch_flag == 0的时候返回false,这样就不会触发HorizontalScrollView的MOVE事件

(6)、如果你按下一个按钮的时候,再移动按钮触发了HorizontalScrollView的ACTION_MOVE,则这个按钮虽然不能触发ACTION_UP事件,但是可以触发ACTION_CANCEL事件,这样我们就可以恢复你在DOWN的时候设置。

Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题相关推荐

  1. oracle in查询 一直等待,学习笔记:Oracle awr 分析解决inactive transaction branch等待事件...

    天萃荷净 通过Oracle AWR报告分析inactive transaction branch等待事件的原因 分析一份awr,发现不太熟悉的等待事件"inactive transactio ...

  2. Android中AppWidget的分析与应用:AppWidgetProvider .

    from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...

  3. android 中怎么实现点击了对话框的按钮以后对话框不会消失,android 中怎么实现点击了对话框的按钮以后对话框不会消失...

    满意答案 henpokeyo 2014.05.17 采纳率:40%    等级:9 已帮助:667人 在android中当你点击了对话框的按钮以后 不管你是否调用了dismis()函数系统本省都会去调 ...

  4. Android 中Touch(触屏)事件传递机制

    版本:2.0 日期:2014.3.21 2014.3.29 版权:© 2014 kince 转载注明出处 一.基本概念 在实际开发中,经常会遇到与触屏事件有关的问题,最典型的一个就是滑动冲突.比如在使 ...

  5. Android Keyboard/Touch Panel分析

    分析一下 Android 是如何读取按键及Touch Panel 的驱动的.主要在 $(ANDROID_DIR)/frameworks/base/libs/ui/EventHub.cpp 这个文件中, ...

  6. android中SELINUX规则分析和语法简介

    点击打开链接 1. SELINUX是可以理解为一种Android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强系统 我们可以通过配置SELINUX的相关policy,来 ...

  7. ANDROID中的VOLD分析

    现在可能很少有人会用mknod这个命令了,也很少有使用它的机会,但就在几年前,这还是一项linux工程师的必备技能,在制作文件系统前或加载新的驱动前,我们必须小心翼翼的创建设备节点. 不需要使用mkn ...

  8. Android中Parcel的分析以及使用

    简单点来说:Parcel就是一个存放读取数据的容器, android系统中的binder进程间通信(IPC)就使用了Parcel类来进行客户端与服务端数据的交互,而且AIDL的数据也是通过Parcel ...

  9. android触摸事件透传,Android中父View穿透子View响应长按事件

    释放双眼,带上耳机,听听看~! 需求 在实际项目开发中,有这样的需求,长按整个ViewGroup响应长按事件,例如长按弹出对话框或者popwindow等等 问题 针对这个需求出现两种情况: 1,当Vi ...

最新文章

  1. python怎么画函数图_可视化|Python绘制桑基图
  2. 将特定像素点在图像上连接起来_(NeurIPS 2019) Gated CRF Loss-一种用于弱监督图像语义分割的新型损失函数...
  3. 更改innodb_page_size状态值
  4. linux php-fpm启动失败,linux运行php-fpm遇到问题
  5. ad采集 cube配置 dma_【技术技巧】 使用MCC数据采集设备获取模拟波形
  6. 搜索引擎学习(三)Lucene查询索引
  7. 专业对不对口重要吗_应届生求职,专业对口到底重不重要?
  8. 深夜,我偷听到程序员要对session下手......
  9. 队列处理器 WorkQueueT
  10. JAVA格式化输出字串
  11. 找不到MSVCR120.dll,无法执行代码 ——问题解决方案
  12. 《电脑商情报》国内信号最强,有效距离最远的四种无线网卡
  13. hook微信 python_GitHub - zkqiang/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
  14. 计算机英语手抄报活动主题,英语手抄报比赛方案
  15. 一文搞懂什么是遗传算法Genetic Algorithm【附应用举例】
  16. 02Hadoop安装教程_单机、伪分布式配置
  17. DNS欺骗与钓鱼网站
  18. secureFX上传中文文件名乱码
  19. Mac安装Mysql卡在最后一步
  20. Python版经纬度坐标转换

热门文章

  1. 致命问题多数据源引发SpringBatch多事物
  2. docker安装redis并设置密码
  3. win11 WSL Ubuntu更换为清华源
  4. 【收藏】如何避免everything每次都重建索引
  5. arthas类和类加载器相关命令:dump、classloader
  6. Linux scp -r命令主机间文件复制
  7. Observer观察者设计模式
  8. Spring配置内置的连接池DriverManagerDataSource
  9. Java泛型失效的两种情况
  10. Linux 下 MediaWiki 的安装使用