当前位置: 首页 > news >正文

Android日常——记一次Android事件分发需求的实现

背景:在一个事件分发复杂的view中,插入一个可点击的控件,且不能影响到本身的事件分发。

尝试:
1.对view本身设置点击事件;由于view整体是交由root view去处理分发,存在滑动、边界处理、调出其他界面等复杂操作。设置点击事件后,root view在该区域无法处理事件,fail。
2.覆写view的onTouchEvent;当返回true时,消费了事件,rootView无法处理,且无法将事件交还,不符合需求;当返回false时,因为整体事件分发复杂,会由其他控件消耗,后续事件无法获取,fail。
3.由于所有事件的分发顺序判断在rootView中,在rootView在处理时将事件传一份给当前view;当前view不参与事件分发的流程,只通过事件判断自己是否应该响应点击事件,pass。

实现:在onTouchEvent中插桩,执行该方法;插桩使用了单例的Controller,回调给对应的view

    // gap,用于判断当前是否可以被认为是一个点击事件private static final float TOUCH_GAP = 50f;// 起始xyprivate float mStartX, mStartY;// 标识位,是否可以执行click事件private boolean mShouldPerformClick;public void handleTouchEvent(MotionEvent event) {if (event == null) return;int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN:// down事件,初始化点击位置;如果点击事件在点击区间内,重置flagmStartX = event.getRawX();mStartY = event.getRawY();if (isInArea(mStartX, mStartY)) {mShouldPerformClick = true;}break;case MotionEvent.ACTION_MOVE:// 判断当前距离是否大于gapfloat currentX = event.getRawX();float currentY = event.getRawY();if (mShouldPerformClick && (Math.abs(currentX - mStartX) > TOUCH_GAP|| Math.abs(currentY - mStartY) > TOUCH_GAP)) {mShouldPerformClick = false;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:// 根据上面的判断,执行点击事件if (mShouldPerformClick) {yourOwnClickEvent();}mShouldPerformClick = false;break;default:break;}}// 判断是否down的位置在view上(此处通过rect去标识,自定义了点击区间)private boolean isInArea(float startX, float startY) {if (mRect.right <= 0) {mContent.getGlobalVisibleRect(mRect);}return startX >= mRect.left && startX <= mRect.right && startY >= mRect.top && startY <= mRect.bottom;}
http://www.lryc.cn/news/182169.html

相关文章:

  • 【Python】函数(function)和方法(method)的区别
  • linux入门---信号的理解
  • nn.Linear(d, num_units, bias=True)设置bias和不设置bias有什么区别?
  • 代码随想录 Day10 栈与队列 LeetCode T239 滑动窗口的最大值 T347 前K个高频元素
  • vue/自定义指令
  • 借用binlog2sql工具轻松解析MySQL的binlog文件,再现Oracle的闪回功能
  • 一次解决Pytorch训练时损失和参数出现Nan或者inf的经历
  • 【python入门篇】列表简介及操作(2)
  • 数据结构与算法——19.红黑树
  • js题解(三)
  • CompletableFuture异步回调
  • Python中匹配模糊的字符串
  • PHP图片文件管理功能系统源码
  • (枚举 + 树上倍增)Codeforces Round 900 (Div. 3) G
  • websocket逆向【python实现websocket拦截】
  • 软件测试自动化的成本效益分析
  • 【Java】状态修饰符 final static
  • 笔试编程ACM模式JS(V8)、JS(Node)框架、输入输出初始化处理、常用方法、技巧
  • learn掩码张量
  • 激活函数介绍
  • docker方式启动一个java项目-Nginx本地有代码,并配置反向代理
  • 前端和后端是Web开发选哪个好?
  • HTTP协议,请求响应
  • idea配置文件属性提示消息解决方案
  • EdgeView 4 for Mac:重新定义您的图像查看体验
  • 流程自动化(RPA)的好处有哪些?
  • 医学影像系统【简称PACS】源码
  • 大家都在用哪些敏捷开发项目管理软件?
  • python机器学习基础教程01-环境搭建
  • TinyWebServer学习笔记-Config