View的dispatchKeyEvent源码分析
目前还不明白的是:KeyEvent是怎么产生的?dispatchKeyEvent是由谁掉用的?所以这里仅对View中KeyEvent的dispatch过程进行分析。分析的源码始于View的dispatchKeyEvent函数(API-26)
Google的注释
先看一下Google对dispatchKeyEvent函数的注释
Dispatch a key event to the next view on the focus path. This path runs from the top of the view tree down to the currently focused view. If this view has focus, it will dispatch to itself. Otherwise it will dispatch the next node down the focus path. This method also fires any key listeners.
这里的focus path还不太明白是什么,整段注释大概的意思是key event会沿着focus path自顶向下传递,若当前view has focus,则把key event dispatch给自己,否则dispatch给focus path上的下一个节点。
源码跟踪
话不多说,先贴dispatchKeyEvent的整段源码
public boolean dispatchKeyEvent(KeyEvent event) {
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onKeyEvent(event, 0);
}
// Give any attached key listener a first crack at the event.
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnKeyListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnKeyListener.onKey(this, event.getKeyCode(), event)) {
return true;
}
if (event.dispatch(this, mAttachInfo != null
? mAttachInfo.mKeyDispatchState : null, this)) {
return true;
}
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);
}
return false;
}
首先会看View有没有set过OnKeyListener,如果有且View是ENABLED的,回调listener的onKey方法。如果onKey方法返回true,表明事件被消费了,则dispatc