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 按键焦点事件分发流程详解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)