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事件是相互独立的。

你可能感兴趣的:(InputDispatcher分发过程)