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

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

 android事件分发机制 就是一个触摸事件发生了,从一个窗口传递到一个视图,再传递到另外一个视图,最后被消费的过程,在android中还是比较复杂的传递流程如下:

(1) 事件从ActivitydispatchTouchEvent()开始传递,只要没有被停止或拦截,从最上层的View(ViewGroup)开始一直往下(子View)传递。子View可以通过onTouchEvent()对事件进行处理。

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

为什么要在构造函数里面去findViewById(),如果想要在viewGroup使用子控件,为什么不换个方式,比如inflate子控件的布局进来处理,如果可以子控件和外部有交互,可以通过接口的方式实现。

DecorView →PhoneWindow →Activity→ViewGroup→view

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

private int processKeyEvent(QueuedInputEvent q)

1、DecorViewjava

2、Activityjava

3、ViewGroupjava

4、Viewjava

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

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

如果mViewdispatchKeyEvent(event)返回true,则结束事件分发;

如果返回false,则调用如下方法

继续执行后续的焦点导航流程。

焦点导航的总体流程就是:

1、View focused = mViewfindFocus();//从视图树的顶层,即DecorView一层一层的递归查找当前获得焦点的view

2、View v = focusedfocusSearch(direction);根据导航的方向查找下一个可获取焦点的view

3、vrequestFocus(direction, mTempRect)请求获取焦点

4、vrequestFocus(direction,mTempRect)内部,调用mParentrequestChildFocus(this, focused)逐层递归向上级通知

ViewRootImpljava

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

找到了当前获得焦点的focused,调用该焦点view的focusSearch(direction)方法查找direction方向上下一个将要获取焦点的view。

focusedfocusSearch(direction)实际上会调用mParentfocusSearch(this, direction)方法,层层递归,直到调用到DecorView的focusSearch(this, direction)方法。

而DecorView继承ViewGroup,实际上最终会调用到FocusFindergetInstance()findNextFocus(this, focused, direction),this 就是DecorView对象。

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

ViewGroupjava

FocusFinderjava

搜索到下一个获取焦点的view后,调用该viewrequestFocus(direction, mTempRect)方法

注意:调用requestFocus(direction, mTempRect)需要区分调用者。

如果是ViewGroup,则会更加焦点获取策略,实现父View和子View之间获取焦点的优先级。

如下是ViewGroupjava 和Viewjava 中requestFocus方法是实现:

ViewGroupjava

Viewjava

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

ViewGroupjava

以上就是关于android 如何获取一个界面最顶层的view并处理单击事件的分发机制全部的内容,包括:android 如何获取一个界面最顶层的view并处理单击事件的分发机制、在自定义的viewgroup中在什么时候获取子控件、Android TV 按键焦点事件分发流程详解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9625329.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存