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

Android的事件分发机制

更多面试题请看这里:https://interview.raoyunsoft.com/
面试题专栏会持续更新欢迎关注订阅

事件分发起点
  • 事件起点是DecorView(Activity的根视图)
  • 完整触摸事件包含:
    ACTION_DOWN(1个) → ACTION_MOVE(0或多个) → ACTION_UP(1个)
ViewGroup和View的关系
继承
包含
包含
包含
包含
包含
View
ViewGroup
onInterceptTouchEvent
dispatchTouchEvent
onTouchEvent
ViewGroup::dispatchTouchEvent核心流程
  1. 拦截判断

    boolean intercepted = onInterceptTouchEvent(ev); // 默认返回false
    
    • 重写时可自定义拦截逻辑(如滑动冲突处理)
    • 返回true表示拦截事件
  2. 遍历子View(未拦截时)

    ArrayList<View> preorderedList = buildTouchDispatchChildList(); // 按Z轴排序
    for (int i = childrenCount - 1; i >= 0; i--) {View child = getAndVerifyPreorderedView(i, children);if (!isTransformedTouchPointInView(x, y, child, null)) continue; // 跳过触点外Viewif (dispatchTransformedTouchEvent(ev, child)) { // 子View消费事件newTouchTarget = addTouchTarget(child); // 记录消费Viewbreak; // 终止遍历}
    }
    
  3. 事件分发逻辑

    • ACTION_DOWN
      • 优先由子View处理
      • 所有子View未处理时触发super.dispatchTouchEvent()(即View父类逻辑)
    • ACTION_MOVE/UP
      while (mFirstTouchTarget != null) {dispatchTransformedTouchEvent(ev, target.child); // 直接传递给记录的View
      }
      
核心分发规则
  1. 事件传递流程

    Activity → DecorView → ViewGroup → ... → TargetView
    
  2. 关键拦截点

    • onInterceptTouchEvent作用:
      • 拦截ACTION_DOWN向子View传递
      • 中断后续ACTION_MOVE/UP传递,转由ViewGroup自身处理
  3. 消费判定

    • 子View通过onTouchEvent()返回true表示消费事件
    • 所有子View未消费时:
      • ViewGroup触发super.dispatchTouchEvent()
      • 最终调用Activity的onTouchEvent()
  4. 多级传递示例

    ViewGroup0ViewGroup1TextViewACTION_DOWNACTION_DOWN"返回true(消费)"返回true"ACTION_MOVE/UP""ACTION_MOVE/UP"ViewGroup0ViewGroup1TextView
重要特性
  1. 责任链模式

    • 事件从顶层ViewGroup向子View递归传递
    • 任一环节消费即终止传递
  2. 触摸目标锁定

    • ACTION_DOWN确定消费View后,后续事件直接路由到该View
    • 通过mFirstTouchTarget链表维护消费关系
  3. Z轴排序机制

    float z = elevation + translationZ; // 决定View的触摸优先级
    

💡 实战技巧:解决滑动冲突时,常通过重写onInterceptTouchEventACTION_MOVE中动态拦截事件,结合requestDisallowInterceptTouchEvent实现父子控件协调处理。

http://www.dtcms.com/a/541506.html

相关文章:

  • 南京传销是以网站开发张槎网站建设
  • 写作网站好吗做游戏视频去哪个网站好
  • 斗兽棋象狮虎豹狼小游戏抖音快手微信小程序看广告流量主开源
  • MySQL的开始,MySQL的安装
  • 构建有记忆的 AI Agent:SQLite 存储 + 向量检索完整方案示例
  • 常州网站关键词优化咨询网站改版对网站优化影响最大的问题有哪些
  • 织梦(dedecms)怎么修改后台网站默认"织梦内容管理系统"标题邯郸seo排名
  • 知识图谱的知识工程建模:如何把名医的“诊断艺术”转化为辅助诊断系统
  • 图表设计网站临清网站推广
  • ubuntu22.04 ros2 fast_lio2 复现
  • 寻找长沙网站建设数据库网站开发
  • 做最好的win7系统下载网站织梦网站模板制作
  • 一条SQL语句的完整执行流程
  • 佛山宽屏网站建设马鞍山哪里做网站
  • 通过API接口批量采购1688商品,一键完成商品下单。
  • 湖北省利川市建设局网站中国安能建设总公司网站
  • 广东省省考备考(第一百三十五天10.28)——言语、判断推理(强化训练)
  • JAVA网络编程TCP通信。
  • 熵增强与量子退火算法与经典迁移策略的结合
  • 数据库安全网关体系中,对Long、Date类型列加密的方法
  • 电子鼻设备市场报告:2025 年行业现状、技术趋势与投资前景全景解析
  • wordpress官方主题论坛嘉兴seo
  • 借助大语言模型实现高效测试迁移:Airbnb的大规模实践
  • 为什么选择做游戏网站哪个网站做网站好
  • 5.1.3 大数据方法论与实践指南-实时湖仓架构设计
  • 咸宁公司做网站深圳结构设计
  • 建网站都用什么字体广东佛山企业
  • 【牛客刷题-剑指Offer】BM23 二叉树的前序遍历:递归与迭代双解法
  • 【算法】day14 链表
  • 手机建设网站赚钱专业seo站长工具