android事件分派(android事件传递与分发)

来源网友投稿 993 2022-12-26

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。
本篇文章给大家谈谈android事件分派,以及android事件传递与分发对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享android事件分派的知识,其中也会对android事件传递与分发进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Android View 事件分发机制

Android 事件机制包含系统启动流程、输入管理(InputManager)、系统服务和 UI 的通信(WindowManagerService + ViewRootImpl + Window)、事件分发等一系列的环节。

Android 系统中将输入事件定义为 InputEvent,根据输入事件的类型又分为了 KeyEvent(键盘事件) 和 MotionEvent(屏幕触摸事件)。这些事件统一由系统输入管理器 InputManager 进行分发。

在系统启动的时候,SystemServer 会启动 WindowManagerService,WMS 在启动的时候通过 InputManager 来负责监控键盘消息。

InputManager 负责从硬件接收输入事件,并将事件通过 ViewRootImpl 分发给当前激活的窗口处理,进而分发给 View。

Window 和 InputManagerService 之间通过 InputChannel 来通信,底层通过 socket 进行通信。

Android Touch 事件的基础知识:

KeyEvent 对应了键盘的输入事件;MotionEvent 就是手势事件,鼠标、笔、手指、轨迹球等相关输入设备的事件都属于 MotionEvent。

InputEvent 统一由 InputManager 进行分发,负责与硬件通信并接收输入事件。

system_server 进程启动时会创建 InputManagerService 服务。

system_server 进程启动时同时会启动 WMS,WMS 在启动的时候就会通过 IMS 启动 InputManager 来监控键盘消息。

App 端与服务端建立了双向通信之后,InputManager 就能够将产生的输入事件从底层硬件分发过来,Android 提供了 InputEventReceiver 类,以接收分发这些消息:

Window 和 IMS 之间通过 InputChannel 通信。InputChannel 是一个 pipe,底层通过 socket 进行通信。在 ViewRootImpl.setView() 过程中注册 InputChannel。

Android 事件传递机制是 先分发再处理 ,先由外部的 View 接收,然后依次传递给其内层的 View,再从最内层 View 反向依次向外层传递。

三个方法的关系如下:

分发事件:

应用了树的 深度优先搜索算法 (Depth-First-Search,简称 DFS 算法),每个 ViewGroup 都持有一个 mFirstTouchTarget, 当接收到 ACTION_DOWN 时,通过递归遍历找到 View 树中真正对事件进行消费的 Child,并保存在 mFirstTouchTarget 属性中,依此类推组成一个完整的分发链。在这之后,当接收到同一事件序列的其它事件如 ACTION_MOVE、ACTION_UP 时,则会跳过递归流程,将事件直接分发给下一级的 Child。

ViewGroup 分发事件的主要的任务是找一个 Target,并且用这个 Target 处理事件,主要逻辑如下 :

为什么倒序查找 TouchTarget?
如果按添加顺序遍历,当 View 重叠时(FrameLayout),先添加的 View 总是能消费事件,而后添加的 View 不可能获取到事件。

拦截事件:

[1] Android 事件分发机制的设计与实现
[2] Android 事件拦截机制的设计与实现

Android TV 按键焦点事件分发流程详解

DecorView →PhoneWindow →Activity→ViewGroup→view

下面我们根据按键事件的分发流程android事件分派,抽丝剥茧,逐一分析。

private int processKeyEvent(QueuedInputEvent q)

1、DecorView.java

2、Activity.java

3、ViewGroup.java

4、View.java

通过该方法,接收器receiver的onKeyDown、onKeyUp、onKeyLongPress、onKeyMultiple等方法将被回调。

在上述按键事件的入口中提到的ViewRootImpl中

如果mView.dispatchKeyEvent(event)返回true,则结束事件分发;
如果返回false,则调用如下方法

继续执行后续的焦点导航流程。
焦点导航的总体流程就是:
1、View focused = mView.findFocus();//从视图树的顶层,即DecorView一层一层的递归查找当前获得焦点的view
2、View v = focused.focusSearch(direction);根据导航的方向查找下一个可获取焦点的view
3、v.requestFocus(direction, mTempRect)请求获取焦点
4、v.requestFocus(direction,mTempRect)内部,调用mParent.requestChildFocus(this, focused)逐层递归向上级通知

ViewRootImpl.java

mView即DecorView,从DecorView开始,一层一层的向下递归查找当前获得焦点的view

找到android事件分派了当前获得焦点的focused,调用该焦点view的focusSearch(direction)方法查找direction方向上下一个将要获取焦点的view。
focused.focusSearch(direction)实际上会调用mParent.focusSearch(this, direction)方法,层层递归,直到调用到DecorView的focusSearch(this, direction)方法。
而DecorView继承ViewGroup,实际上最终会调用到FocusFinder.getInstance().findNextFocus(this, focused, direction),this 就是DecorView对象。

最终会调用到DecorView父类ViewGroup中的FocusFinder.getInstance().findNextFocus(this, focused, direction);

ViewGroup.java

FocusFinder.java

搜索到下一个获取焦点的view后,调用该view.requestFocus(direction, mTempRect)方法
注意:调用requestFocus(direction, mTempRect)需要区分调用者。
如果是ViewGroup,则会更加焦点获取策略,实现父View和子View之间获取焦点的优先级。
如下是ViewGroup.java 和View.java 中requestFocus方法是实现:

ViewGroup.java

View.java

View获取到焦点后,会调用mParent.requestChildFocus(this, focused)逐层递归向上级通知
ViewGroup.java

Android-View的事件分发及拦截-父控件和子控件都处理触摸事件的方式

比如接着上篇 Android-View的事件分发及拦截机制简单流程先体验再研究(场景?疑问? 具体?待续...) ,小白现在要实现就是子View和父ViewGroup都响应点击事件。

1. 单纯的都只是响应down事件

这个就很简单了 - 直接子View的**public boolean **onTouchEvent(MotionEvent event) 里面直接返回false就行了。也就是子控件响应了一次down后,接下来就交给父ViewGroup了.(子View就啥几把也干不了了);

2. 响应down和up事件,move啥的

我们知道子View如果onTouch里面返回了true,那么将会处理后续的move,up事件。而不再交给上层父ViewGroup。那父ViewGroup就没办法在Touch里面处理,所以我们只能放到dispatchTouchEvent或者onInterceptTouchEvent中处理这个down,up等事件:

比如dispatchTouchEvent中:

这样的情况就是父ViewGroup先执行点击事件,然后子View再执行。 如果您需要父ViewGroup晚点,可以延时执行啥的。

如果此时,子View的dispatchTouchEvent返回true - 表示拦截,不继续了

那么子View的所有的事件都不会响应了。其实也就是我们的一个事件先传递,touch再处理的树形图:

百度上拔个图来

简单记录下下而已,继续加深理解...这是上一篇的续,还是上一篇....啧啧....后面是官方文档分析来着...

android 如何获取一个界面最顶层的view并处理单击事件的分发机制

android事件分发机制 就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程如下:
(1) 事件从Activity.dispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

(2) 事件由父View(ViewGroup)传递给子View,ViewGroup可以通过onInterceptTouchEvent()对事件做拦截,停止其往下传递。

Android可监听的事件类型?(提示:用户事件和系统事件,用户事件又分为按键事件和触屏事件)

在android系统中android事件分派,存在多种界面事件android事件分派,如点击事件android事件分派,触摸事件,焦点事件,和菜单事件
用户事件和系统事件等,事件发生时,android界面框架调用界面控件android事件分派的事件处理函数对事件进行处理。
android事件分派:用户事件:
按键事件:keyevent将传递给onkey()函数进行处理
触屏事件:touchevent将传递给ontouch()函数进行处理。 关于android事件分派和android事件传递与分发的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 android事件分派的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于android事件传递与分发、android事件分派的信息别忘了在本站进行查找喔。
上一篇:zabbix告警音(zabbix50告警)
下一篇:zabbix告警阀值(zabbix支持哪些报警机制)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~