輸入法原理

2021-09-05 01:26:30 字數 1782 閱讀 7594

question1:客戶端如何與輸入法產生聯絡

這個是輸入法的經典流程圖,上面我們說過,應用程序使用的是imm,輸入法程序使用的是ims,在imm和ims中間是乙個系統服務,縮寫是imms

但是日常使用中,我們並沒有主動呼叫imm,但是輸入法卻能正常使用,比如當我們進入乙個有 edittext控制項的介面時,會自動彈出軟鍵盤,原因是系統默默的幫我們做了很多任務作。在新增或者刪除視窗時,windowmanagerservice會上自下判斷由哪個視窗獲取焦點,wms拿到焦點window後會跳到的viewrootimpl,然後通過decorview分發到各個view,最後調的是view的onwindowfocuschanged, 布林值引數表示當前view所在視窗得到還是失去焦點, 我們直接看得到焦點這個分支,這個判斷條件表示當前view能不能拿到焦點,如果view也能拿到焦點的話,最終會走到startinputinner,在該方法中會初始化view的程序通訊介面,並呼叫imm的startinput方法把該介面傳遞給輸入法,在imms中會完成輸入法建立和程序通訊介面雙向繫結的工作,當輸入法生成資料後,會通過這個binder把資料傳遞給應用程序

question2:從原始碼上看,輸入法是無法獲取焦點的(由於輸入法window設定了flag_not_focusable屬性,所以無法獲取焦點),因此,我們第一反應是輸入法拿不到硬鍵盤輸入keyevent,但事實上,輸入法可以完美支援硬鍵盤

上面仔細分析了輸入法的整體流程,其中,硬鍵盤事件是在viewrootimpl中處理的,當系統把焦點事件傳遞給獲取焦點的window時,viewrootimpl會通過dispatchinputevent方法把硬鍵盤事件傳遞給輸入法

question3:如何實現乙個輸入法應用,直接上圖

我們直接繼承ims,其中setcandidatesview(view)用來設定候選詞檢視,setinputview(view)用來設定輸入檢視,getcurrentinputconnection用來獲取應用程序的通訊介面(inputconnection),這裡面主要有兩個方法比較常用,sendkeyevent和committext,其中sendkeyevent用來傳送硬鍵盤事件(刪除等),committext用來傳送文字

windowsoftinputmode:

stateunchanged:當前介面的軟鍵盤狀態,取決於上乙個介面的軟鍵盤狀態。舉個例子,假如當前介面鍵盤是隱藏的,那麼跳轉之後的介面,軟鍵盤也是隱藏的;如果當前介面是顯示的,那麼跳轉之後的介面,軟鍵盤也是顯示狀態

statehidden:正常跳轉總是隱藏鍵盤

statevisible:正常跳轉總是顯示鍵盤

adjustresize:當鍵盤彈出時,從下往上壓縮activity布局,壓縮的距離等於鍵盤的高度。壓縮之後,不管edittext是否可見

adjustpan:當鍵盤彈出時,如果edittext被鍵盤遮擋,activity內容會向上滾動,以保證edittext不被鍵盤遮擋;如果edittext不被遮擋,則不滾動

輸入法控制

unit u ime inte ce implementation uses windows,forms,imm,sysutils,messages varstmpclassname,stmpime string 失去焦點時的控制項名稱和輸入法名稱 msghandle hhook 0 判斷當前類名是...

輸入法鉤子

分為1個dll工程和1個win32空工程。新建乙個dll空工程,字符集使用多位元組字符集。以下是源 shurufa.h ifndef shurufa h define shurufa h include include include include pragma comment lib,imm32...

輸入法設定

scim 1.兩個scim圖示 使用 superuser產生乙個,可在設定裡將他從工作列隱藏 2.無法在eva中使用 sudo apt get install scim qtimm fcitx 1.安裝 設定預設 sudo apt get install fcitx sudo apt get ins...