-
public void handleMotion(MotionEvent event, InputQueue.FinishedCallback finishedCallback) {
-
startInputEvent(finishedCallback);
-
dispatchMotion(event, true);
-
}
-
};
dispatchKey()函数内部发送一个DISPATCH_KEY消息,消息的处理函数为deliverKeyEvent():
[java] view plain copy
-
private void dispatchKey(KeyEvent event, boolean sendDone) {
-
//noinspection ConstantConditions
-
if (false && event.getAction() == KeyEvent.ACTION_DOWN) {
-
if (event.getKeyCode() == KeyEvent.KEYCODE_CAMERA) {
-
if (DBG) Log.d(“keydisp”, “===================================================”);
-
if (DBG) Log.d(“keydisp”, “Focused view Hierarchy is:”);
-
debug();
-
if (DBG) Log.d(“keydisp”, “===================================================”);
-
}
-
}
-
Message msg = obtainMessage(DISPATCH_KEY);
-
msg.obj = event;
-
msg.arg1 = sendDone ? 1 : 0;
-
if (LOCAL_LOGV) Log.v(
-
TAG, "sending key " + event + " to " + mView);
-
enqueueInputEvent(msg, event.getEventTime());
-
}
-
@Override
-
public void handleMessage(Message msg) {
-
switch (msg.what) {
-
…
-
case FINISHED_EVENT:
-
handleFinishedEvent(msg.arg1, msg.arg2 != 0);
-
break;
-
case DISPATCH_KEY:
-
deliverKeyEvent((KeyEvent)msg.obj, msg.arg1 != 0);
-
break;
-
case DISPATCH_POINTER:
-
deliverPointerEvent((MotionEvent) msg.obj, msg.arg1 != 0);
-
break;
deliverKeyEvent()函数的执行流程如下:
1、调用mView.dispatchKeyEventPreIme(),如果有输入法存在,那么按键消息首先会被派发到输入法窗口,如果想在输入法截获消息之前处理该消息,那么可以重载该函数。
2、imm.dispatchKeyEvent()将消息派发到输入法窗口
3、调用deliverKeyEventPostIme()继而调用到mView.dispatchKeyEvent()
[java] view plain

本文详细介绍了Android中View的按键消息处理流程,从handleMotion和dispatchKey函数开始,深入到deliverKeyEvent的执行,包括输入法拦截、预处理和后处理。文中提及了dispatchKeyEvent在Activity和ViewGroup中的分发机制,以及如何在不同层级处理按键事件。
最低0.47元/天 解锁文章
1452

被折叠的 条评论
为什么被折叠?



