Android 自帶的輸入法有三種,分別為Android Keyboard、谷歌拼音输入法、Japanese IME。它们实际上就是app,输入法应用程序。
源码在:/home/$USER/administrator/source_code/qct/DataDisk/U7699EP-wharton/Linux/packages/inputmethods里面,对应为LatinIMEPinyinIMEOpenWnn
Android的输入法框架比较复杂。从进程的角度来讲,相关功能主要分布在下面三个位置:
客户端应用是一个包含有图形界面的应用,如地址本。图形界面上包含有能够接收输入的编辑框,如TextView
输入法模块提供软键盘,将用户在软键盘上的按键输入根据某种算法(如Zi, T9, 国笔等)转换成单词,然后传递给客户端应用。
平台部分实现一些管理功能,负责装载某个输入法模块,启动,终止该模块等。
创建一个输入法,必须继承android.inputmethodservice.InputMethodService,它作为一个服务,监听所有EditText安卓unicode输入法的事件。下面是实现一个基本的输入法程序的步骤。
1. 建立一个继承自android.inputmethodservice.InputMethodService 的类,称为输入法的服务类。
2. l 文件中配置这个服务类。
3. 编写一个用于显示软键盘的布局文件。
4. 覆盖InputMethodService类的 onCreateInputView 方法。
5. onCreateInputView 方法需要返回与第3步建立的布局文件对应的View 对象。在返回之前,一般需要设置相应控件的事件,如软键盘按钮单击事件。
6. 在输入法服务类或其他类中编写响应软键盘中按键事件的代码,如按钮单击事件、物理键盘事件等。
在用户触发输入法显示的时候(点击输入框),InputMethodService启动,然后调用onCreate() 函数,该函数在输入法第一次启动的时候调用,适合用来做一些初始化的设置,切忌不要在代码中直接调用该函数;然后调用onCreateInputView() 函数,在该函数中创建KeyboardView并返回;然后调用onCreateCandidatesView()函数,在该函数中创建候选区实现并返回;然后调用onStartInputView(EditorInfo attribute, boolean restarting)函数来开始输入内容,输入结束后调用onFinishInput()函数来结束当前的输入,如果移动到下一个输入框则重复调用onStartInputViewonFinishInput函数;在输入法关闭的时候调用onDestroy() 函数。
以下是LatinIME 输入法分析:
输入法的设置在res/l<input-method>标签中,主要设置两个属性:
android:settingsActivity,输入法的设置程序入口。
android:isDefault,这个输入法是不是系统的默认输入法。
LatinIME.javaLatinIME 继承 InputMethodService;生命周期中方法均在此文件中实现。
最基本的字母布局由res/xml/下面的l,kbd_l定义,其它的还有符号布局,数字布局等也都在这个文件夹下面。当用户进行操作时,程序就会在这些布局之间来回切换。
Row元素说明这是一行按键的定义,Key元素说明这是一个按键的定义。Key元素通过一些属性来定义每个按键,绘制Key的时候,主要绘制两个东西,labelicon。对于a,b,c,1,2,&等这样可以用字符来表示的键,就绘制它的label属性。对于Shift,Alt等这样无法用字符表示的键,就绘制它的icon属性。
下面是一些常用的属性介绍:
Codes:代表按键对应的输出值,可以为unicode值或则逗号(,)分割的多个值,也可以为一个字符串。在字符串中通过“\\”来转义特殊字符,例如 '\\n' 或则 '\\uxxxx' Codes通常用来定义该键的键码,例如数字按键1对应的为49;如果提供的是逗号分割的多个值则和普通手机输入键盘一样在多个值之间切换。
keyLabel:代表按键显示的文本内容。
keyIcon:代表按键显示的图标内容,如果指定了该值则在显示的时候显示为图片不显示文本。
keyWidth:代表按键的宽度,可以为精确值或则相对值,对于精确值支持多种单位,例如:像素,英寸 等;相对值为相对于基础取值的百分比,为以% 或则%p 结尾,其中%p表示相对于父容器。
keyHeight:代表按键的高度,取值同上。
horizontalGap:代表按键前的间隙(水平方向),取值同上。
isSticky:指定按键是否为sticky的。例如Shift大小写切换按键,具有两种状态,按下状态和正常状态,取值为true或则false
isModifier:指定按键是否为功能键( modifier key ) ,例如 Alt 或则 Shift 。取值为true或则false
keyOutputText:指定按键输出的文本内容,取值为字符串。
isRepeatable:指定按键是否是可重复的,如果长按该键可以触发重复按键事件则为true,否则为false
keyEdgeFlags:指定按键的对齐指令,取值为left或则right