android 自定义输入法布局,Android 输入法详解
我們自己要重寫一個簡單的輸入法確實很簡單,但是要寫一個輸出中文或者五筆等等就比較麻煩。因為你需要引擎,建議使用別人的引擎先進行改造。這篇文章著重是在輸入法UI層面上進行講解,不涉及引擎問題,引擎問題可以查看源碼或者網上自行查找學習(或者下一篇文章會推出).
note: 本文章有一些內容是涉及TV端的,本程序猿是一枚android TV開發人員.
1. 了解輸入法整體的窗口布局.
手機 搜狗輸入法 截圖:
TV端 搜狗輸入法 截圖:
TV端主要是遙控器操作(上,下,左,右,確定),鼠標也是支持的。
輸入法的布局分為兩部分,上面為 候選框,下面為 鍵盤區域.
2. 簡單了解下谷歌的輸入法
谷歌的輸入法是按照MVC模式來寫的,輸入法的界面 原理很簡單,讀取XML布局,繪制鍵盤區域.
PinyinIME 為谷歌的拼音輸入法。
LatinIME 是外文輸入法,包含了很多外國的語言。
如果有源碼,可以自己看看谷歌的PinyinIME的res\xml 目錄下的 xml文件.
然后也可以看看
XmlKeyboardLoader.java 文件 是如何加載并解析XML文件的.
SoftKeyboardView.java 文件是根據解析的XML文件繪制出 鍵盤區域的.
谷歌PinyinIME源碼地址:http://git.oschina.net/kumei/PinyinIME_GOOGLE (可以編譯的版本)
3. 如何寫一個簡單的輸入法
谷歌有一套輸入法框架,也提供了編寫輸入法的API,請記住這個類(InputMethodService.java).
InputMethodService 是輸入法的關鍵核心類.
插入一個小插曲,本人以前是搞LINUX桌面開發的,那個時候linux桌面的輸入法真的很難用.
Linux的輸入法框架有很多,有 SCIM, ibus, Fcitx,大家可以簡單的了解下.
后來?搜狗 與 fcitx 合作開發,才有了 搜狗 for linux,真心表示很贊.
關鍵核心類有幾個重要的函數:
onCreateCandidatesView 創建 候選框區域視圖,一般是返回一個layout布局.
onCreateInputView 創建 鍵盤區域視圖,也是一般返回一個layout布局.
看看在 AndroidManifest.xml要如何寫.
android:name="com.....自定義InputMethodService"
android:label="@string/app_name"
android:permission="android.permission.BIND_INPUT_METHOD" >
android:name="android.view.im"
android:resource="@xml/method" />
注意 android:permission 與 action(android.view.InputMethod),還有 meta-data。
android:permission="android.permission.BIND_INPUT_METHOD"
綁定輸入法,請求InputMethodService服務,只有系統才能使用。(網上給出的解釋)
而且還是一個你作為輸入法的標識.
action(android.view.InputMethod)
meta-data
再看看 xml 的 method.xml
android:isDefault="true"
android:settingsActivity="com.....setting.自定義SettingsActivity" />
android:settingsActivity 不用多說,就是 輸入法設置界面.
input-method 支持很多語法,有興趣的可以上網查查.
經過上面幾個步驟,基本上一個超級簡單的輸入法就出來了.
給 鍵盤區域 返回 一個簡單的 layout布局(帶幾個button就OK)
也許你的輸入法雛形已經出來了,你會帶著好幾個疑問與好奇?
1. 輸入法 的 文字 如何 輸入 到 EditText 的? (看下面的代碼)
/**
* 發送字符到編輯框(EditText)
*/
public void commitResultText(String resultText) {
InputConnection ic = getCurrentInputConnection();
if (null != ic && !TextUtils.isEmpty(resultText)) {
ic.commitText(resultText, 1);
}
}
2. 是如何根據 EditText 的 一些參數進行設置的?
android:inputType 來 如何切換輸入法不同的鍵盤?
在?InputMethodService 有一個函數?onStartInputView,這個函數
android:imeOptions 來顯示 下一步,完成,搜索 等等?
android:imeActionLabel 如何顯示文字在輸入法的完成鍵上的?
3. 輸入法是如何不占據全屏的?
InputMethodService 的函數
@Override
public boolean onEvaluateFullscreenMode() {
return false;
}
4. 輸入法是如何使用引擎(中文,五筆等等)的?
5. 輸入法上是如何向EditText刪除文字的?
6. 輸入法是如何向EditText移動光標的?
why ? 移動光標?這種需求主要是面向TV端的,如何做的,我只能粗暴的貼代碼了.
本來想了幾種方式,后來在WPS這種多行文本一測試,很多移動光標的方式都有問題,最后只剩下這種方式最穩妥.
/**
* 輸入框的光標向右移動.
*/
public void setCursorRightMove() {
int cursorPos = getSelectionStart();
cursorPos++;
getCurrentInputConnection().setSelection(cursorPos, cursorPos);
}
/**
* 輸入框的光標向左移動.
*/
public void setCursorLeftMove() {
int cursorPos = getSelectionStart();
cursorPos--;
if (cursorPos < 0)
cursorPos = 0;
getCurrentInputConnection().setSelection(cursorPos, cursorPos);
}
7. 輸入法如何發送按鍵給EditText?
8. 如何編寫與自定義 自己 輸入法的XML?
9. 如何繪制漂亮的輸入法界面?
10.如何發送表情
后續繼續完善,還沒有寫完 .. ... (先休息羅... ...)
我的開源項目:
http://git.oschina.net/kumei/OpenInputMethod 一個英文輸入法demo,高仿TV端搜狗輸入法界面.
http://git.oschina.net/kumei/zhuyin_inputmethod 一個臺灣注音輸入法,使用的網上的開源注音引擎.
總結
以上是生活随笔為你收集整理的android 自定义输入法布局,Android 输入法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android手机活跃度,微信Andro
- 下一篇: Fashion-MNIST数据集离线加载