//抬起,com.android.inputmethod.latin
NativePostImeInputStage::onProcess
ViewPostImeInputStage::onProcess
@frameworks/base/core/java/android/app/Dialog.java
dispatchTouchEvent //MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=193.0, y[0]=690.0, toolType[0]=TOOL_TYPE_FINGER, displayId=0
@frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java
mWindow.superDispatchTouchEvent(ev)
@frameworks/base/core/java/com/android/internal/policy/DecorView.java
mDecor.superDispatchTouchEvent(event);
@frameworks/base/core/java/android/view/View.java
super.dispatchTouchEvent(event);
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
if (!result && onTouchEvent(event)) {
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/PointerTracker.java
tracker.processMotionEvent(event, mKeyDetector);
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
onUpEvent(x, y, eventTime);
onUpEventInternal(x, y, eventTime);
detectAndSendKey(currentKey, mKeyX, mKeyY, eventTime);
callListenerOnCodeInput(key, code, x, y, eventTime, false /* isKeyRepeat */);
if (key.isEnabled() || altersCode) {
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/keyboard/internal/TypingTimeRecorder.java
sTypingTimeRecorder.onCodeInput(code, eventTime);
else if (code != Constants.CODE_UNSPECIFIED) {
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/LatinIME.java
} else { sListener.onCodeInput(code, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, isKeyRepeat);
final Event event = createSoftwareKeypressEvent(getCodePointForKeyboard(codePoint), keyX, keyY, isKeyRepeat);
onEvent(event);
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
final InputTransaction completeInputTransaction = mInputLogic.onCodeInput(mSettings.getCurrent(), event, mKeyboardSwitcher.getKeyboardShiftMode(), mKeyboardSwitcher.getCurrentKeyboardScriptId(), mHandler);
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/WordComposer.java
final Event processedEvent = mWordComposer.processEvent(event);
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/event/CombinerChain.java
final Event processedEvent = mCombinerChain.processEvent(mEvents, event);
for (final Combiner combiner : mCombiners) {
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/event/DeadKeyCombiner.java
event = combiner.processEvent(modifiablePreviousEvents, event);
refreshTypedWordCache();
mTypedWordCache = mCombinerChain.getComposingWordWithCombiningFeedback();
final SpannableStringBuilder s = new SpannableStringBuilder(mCombinedText); //mCombinedText=Name
mCodePointSize = Character.codePointCount(mTypedWordCache, 0, mTypedWordCache.length()); //mCodePointSize=4 mTypedWordCache.length()=4
handleNonFunctionalEvent(currentEvent, inputTransaction, handler);
default: handleNonSpecialCharacterEvent(event, inputTransaction, handler);
handleNonSeparatorEvent(event, inputTransaction.mSettingsValues, inputTransaction);
boolean isComposingWord = mWordComposer.isComposingWord();
return size() > 0;
return mCodePointSize; //这里的大小为4
if (isComposingWord) { //输入数字key还是数字单词开始的流程主要是isComposingWord的值不一样,数字单词为true
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/WordComposer.java
mWordComposer.applyProcessedEvent(event);
mCombinerChain.applyProcessedEvent(event);
final CharSequence textToCommit = event.getTextToCommit(); //textToCommit=1 mCombinedText=Name
if (!TextUtils.isEmpty(textToCommit)) { mCombinedText.append(textToCommit); } //如果需要提交的文本非空,则添加进去
refreshTypedWordCache();
mTypedWordCache = mCombinerChain.getComposingWordWithCombiningFeedback();
final SpannableStringBuilder s = new SpannableStringBuilder(mCombinedText);
mCodePointSize = Character.codePointCount(mTypedWordCache, 0, mTypedWordCache.length()); //mCodePointSize=5 mTypedWordCache.length()=5
setComposingTextInternal(getTextWithUnderline(mWordComposer.getTypedWord()), 1);
setComposingTextInternalWithBackgroundColor(newComposingText, newCursorPosition, Color.TRANSPARENT, newComposingText.length());
@packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/RichInputConnection.java
mConnection.setComposingText(composingTextToBeSet, newCursorPosition);
@frameworks/base/core/java/com/android/internal/view/InputConnectionWrapper.java
if (isConnected()) { mIC.setComposingText(text, newCursorPosition); }
mIInputContext.setComposingText(text, newCursorPosition); //跨进程通信,输入法应用调用app应用的sendKeyEvent, 这里的app是com.example.myapplication
dispatchMessage(obtainMessageIO(DO_SET_COMPOSING_TEXT, newCursorPosition, text));
case DO_SEND_KEY_EVENT: {
InputConnection ic = getInputConnection();
@frameworks/base/core/java/android/view/inputmethod/InputConnectionWrapper.java
ic.setComposingText((CharSequence) msg.obj, msg.arg1);
@frameworks/base/core/java/android/view/inputmethod/BaseInputConnection.java
mTarget.setComposingText(text, newCursorPosition);
@frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
replaceText(text, newCursorPosition, true);
beginBatchEdit();
int a = getComposingSpanStart(content);
int b = getComposingSpanEnd(content);
content.replace(a, b, text);
endBatchEdit();
Android原生输入法输入数字单词流程
于 2024-08-02 09:15:15 首次发布