InputDispatcher分发过程

InputDispatcher分发过程:
1.用户通过手(touch)或者按键(key)产生的事件,会经过以下路线进行传递:
InputReader ==> InputDispatcher ==> ViewRootImpl

2.对于所有传到ViewRootImpl的事件:
2.1 如果这个事件没有被InputDispatcher设置跳过IME的话,会按照以下路线进行传递:
FirstInputStage(NativePreImeInputStage)==> ViewPreImeInputStage ==> ImeInputStage ==> EarlyPostImeInputStage ==> NativePostImeInputStage ==> ViewPostImeInputStage ==> SyntheticInputStage

2.2 如果这个事件被InputDispatcher设置跳过IME的话,会按照以下路线进行传递:
EarlyPostImeInputStage ==> NativePostImeInputStage ==> ViewPostImeInputStage ==> SyntheticInputStage

上面每个XXXInputStage里面都有调用View的不同的方法,这些不同的方法直接或间接提供可重写的方法供APP自定义View时根据自己的需求重写,实现自己的事件处理逻辑。如果事件在上面任意一个阶段被消耗掉,那么就不会继续往后传, 如果所有阶段都不消耗事件,那么事件将被最后一个SyntheticInputStage消耗。

3.在ImeInputStage阶段,如果输入法存在且当前的View是输入法的目标View,那么事件直接传给输入法进行处理。

4.对于APP来说,绝大多数自定义View重写的事件处理方法都属于ViewPostImeInputStage这一阶段。比如,dispatchTouchEvent、onTouchEvent、OnTouchListener.onTouch。

5.对于Button的key事件,如果这个事件永远都不想让IME获取的话,可以继承Button,重写里面的onKeyPreIme,在onKeyPreIme里面处理key事件,处理完返回true就终止了事件传递。

或者重写dispatchKeyEventPreIme,在dispatchKeyEventPreIme里面调用dispatchKeyEvent,这样原来所有的逻辑就不用变了。

6.touch事件和key事件是相互独立的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 8,884评论 1 11
  • 此处记录按键事件从Framework到应用层的传递流程。WMS中接收到消息后,会调用ViewRootImpl中的d...
    小的橘子阅读 10,796评论 0 6
  • Windows 95中文输入法编辑器(IME) 微软 翻译:TBsoft Software Studio ...
    returntrue阅读 7,744评论 0 3
  • 161-180 消弱是指个体的一件行为,一连发生多次,都未能带来满意后果,无法获得所欲的增强物,其强度逐渐衰弱,最...
    文昌许珊珊阅读 2,833评论 0 0
  • 早晨,我骑着电动车,载着孩子去深蓝培训学校补习。 母女俩快乐地在路上行进着。孩子坐在我的身后,喋喋不休地和我说着她...
    生活馈赠与我阅读 1,306评论 0 1

友情链接更多精彩内容