LatinIME輸入法分析

2021-05-24 02:25:09 字數 1270 閱讀 4937

輸入法的設定在res/xml/method.xml的標籤中,主要設定兩個屬性:

android:settingsactivity,輸入法的設定程式入口。

android:isdefault,這個輸入法是不是系統的預設輸入法。

最基本的字母布局由res/xml/下面的kbd_qwerty.xml,kbd_qwerty_black.xml定義,其它的還有符號布局,數字布局等也都在這個資料夾下面。當使用者進行操作時,程式就會在這些布局之間來回切換。

對這些布局的解析由keyboard(位於framework中)以及它的子類latinime(位於latin輸入法的原始碼中)一起完成,涉及到的主要方法有:

1、loadkeyboard:解析布局檔案

2、latinkeyboard.createkeyfromxml,keyboard.createkeyfromxml:從xml檔案建立乙個按鍵。

3、getdimensionorfraction:獲取某乙個屬性的值。這個屬性值的格式必須規定為dimen(dip,px,sp,in等)或者fraction(百分比)的。

4、latinkeyboardbase.onbufferdraw:把所有的key繪製在一張bitmap上,再由繼承自viewondraw方法把這張bitmap渲染到ondraw傳遞過來的canvas上。

繪製key的時候,主要繪製兩個東西,label和icon。對於a,b,c,1,2,&等這樣可以用字元來表示的鍵,就繪製它的label屬性。對於shift,alt等這樣無法用字元表示的鍵,就繪製它的icon屬性。

另外,大部分key只繪製icon或label中的乙個。而少部分key,兩個都繪製。比如qwertyuiop這幾個key,還會在key的右上方有乙個小的數字,這些小數字每乙個都是乙個icon,存放在latinkeyboard的mnumberhinticons陣列中。而qwertyuiop這幾個key是一組比較特殊的key,它們會在latinkeyboard中有乙個引用備份:mnumberhintkeys。每次使用者按shift來更新鍵盤布局時,除了會更新這幾個key的label之外,都會呼叫updatenumberhintkeys方法把它們的icon也賦值。

這次遇到的問題是latinime布局混亂,開啟這個輸入法時,整個輸入法介面被擠在螢幕下方乙個高度很小的矩形範圍內。經過跟蹤,發現輸入法的布局的高度寬度,每個key的高度寬度等資訊都是定義在dimens.xml中的。而在dimens.xml中,這些尺寸的單位都是in,在程式當中把這些單位轉化成畫素以後,是個很小的值。最後把這些尺寸單位改為dip,並設定好合適的值就好了。看來是系統移植到板子上以後,in和畫素之間進行轉換時出問題了。

LatinIME輸入法分析

輸入法的設定在res xml method.xml的標籤中,主要設定兩個屬性 android settingsactivity,輸入法的設定程式入口。android isdefault,這個輸入法是不是系統的預設輸入法。最主要的字母布局由res xml 以下的kbd qwerty.xml,kbd q...

LatinIME輸入法的一些總結

1.關於輸入法的一些設定重要檔案 res xml method.xml 在該檔案中在前面的部落格中說明可以新增鍵盤輸入語言。另外,還有其他的一些重要的設定 輸入法的設定在res xml method.xml的標籤中,主要設定兩個屬性 android settingsactivity,輸入法的設定程式...

智慧型ABC輸入法溢位分析

下面在來看一段關於0x7380ac95的 7380adb4 56 push esi 7380adb5 e8 58140000 call winabc.7380c212 7380adba 85c0 test eax,eax 7380adbc 74 20 je short winabc.7380adde...