1.OnClickListener
监听事件的写法就不多说了,这里直接开解释。也就是说当View被单击的时候就会执行的一系列动作,这里回调只有onClick(View v),结合设计模式来说就是,响应了接口隔离原则,将类之间的关系建立在最小接口之上,比如说 focus longClick drag等等。
3.事件处理分析
…ActivityThread消息队列(罗老师的消息机制处理http://blog.csdn.net/luoshengyang/article/details/6817933) |
InputEventReceiver.dispatchInputEvent 这里是系统层调用的,然后调用ViewRootImpl的onInputEvent |
ViewRootImpl.WindowInputEventReceiver.onInputEvent |
ViewRootImpl.enqueueInputEvent 设置processImmediately=true |
ViewRootImpl.doProcessInputEvents 这里因为processImmediately=true,立马执行而不是scheduleProcessInputEvents |
ViewRootImpl.diliverInputEvent 这里如果说没有设置任何View的话是不会提交输入事件队列的 |
ViewRootImpl.InputStage.deliver 如果事件结束了,就会继续提交下一个事件队列,如果sholdDropInputEvent返回true,那么就会标记这个事件队列为finish,然后提交下一个事件队列,这里通过onProcess返回forward |
ViewRootImpl.InputStage.apply 这里有三种情况 forward finish_handled finish_no_handled 分别对应了继续提交队列,设置当前队列为结束的标示继续提交,设置当前队列结束标示不进行队列提交操作,其他情况就会抛出异常 |
ViewRootImpl.InputStage.forward 这里又个类似于一种编程习惯,不知道可不可以这么理解,在上一个方法体内如果存在大量的逻辑,这里可以引用出来一个方法体,用来做其他的事情,一个是减少方法的数量于责任的分层,另一个方面留有扩展性,代表的是这么一类的方法体,个人理解 |
ViewRootImpl.InputStage.onDeliverToNex 如果还有队列那么久继续提交,否则就结束输入事件队列 |
ViewRootImpl.AsyncInputStage.apply 这里onProcess返回forward 因此��️交给了InputStage的apply,然后执行的是AsyncInputStage.forward, |
ViewRootImpl.AsyncInputStage.forward 继续提交到ViewPostImeInputStage输入法事件 |
ViewRootImpl.ViewPostImeInputStage.onProcess 处理不同的事件 key pointer trackball genericmotion |
ViewRootImpl.ViewPostImeInputStage.processPointerEvent 这里如果说mCapturingVeiw=null 那么负责分发事件就是根布局。也就是setContentview的根布局 |
View.dispatchPointerEvent 这里一般我们都会从此开始分析事件 下发事件 |
DecorView.dispatchTouchEvent 这里DecorView就是使用了装饰着的模式。其和策略模式有点相似,只不过装饰着即使继承又可以为对象扩展功能,相对于生成子类来说更加的方便 |
WIndowProfilerCallback.dispatchTouchEvent |
WindowCallbackWrapper.dispatchTouchEvent |
Activity.dispatchTouchEvent 如果说想要拦截所有screen的事件,可以重写这个方法 |
PhoneWindow.superDispatchTouchEvent 然后继续分发 |
DecorView.superDispatchTouchEvent 直接分发父类的touchevent |
ViewGroup.dispatchToutchEvent (参考http://wangkuiwu.github.io/2015/01/04/TouchEvent-ViewGroup/) |
ViewGroup.dispatchTransformedTouchEvent 转换活动事件为view的特定坐标 |
View.dispatchTouchEvent 返回true 说明目标view处理了事件 |
目标view.onTouchEvent——》View.onTouchEvent 如果不想上传递super.onTouchEvent的话可以重写然后就可以控制触碰事件的处理,不用执行performClick |
|
|
|
|
以上链接借鉴与其他的博客地址,如何侵权,告知我进行删改 |