输入法的设置在res/xml/method.xml的<input-method>标签中,主要设置两个属性:
android:settingsActivity,输入法的设置程序入口。
android:isDefault,这个输入法是不是系统的默认输入法。
另外,假设输入法的apk直接push到/system/app/以下的话,算是系统输入法,假设是以第三方程序的方式安装到/data/app/以下的话,算是第三方输入法,两个输入法眼下来看,最大的不同在于,使用第三方输入法时必须在设置->语言和键盘其中手工启动。
最主要的字母布局由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和像素之间进行转换时出问题了。