目錄
文件目錄結構:
/src 代碼文件目錄
/src/com/soling/inputMethod 主體邏輯類代碼目錄
/src/com/soling/inputMethod/EN 針對英文鍵盤邏輯代碼目錄[注:目前未使用]
/src/com/soling/inputMethod/JAPA 針對日語鍵盤邏輯代碼目錄
/src/com/soling/inputMethod/presenter P層業務邏輯接口以及實現類
/src/com/soling/inputMethod/Service 與AutoCore(音源管理apk)交互的代理實現類
/libs 日語SO庫源碼
/res 各資源文件目錄
/res/xml 鍵盤佈局定義文件目錄
/….. 其餘目錄此處暫省略不再介紹
各類功能說明
類名 |
說明 |
BaseInputView.java |
繼承LinearLayout,輸入法的基礎佈局自定義類 |
CandidateFilter.java |
候選詞過濾的工具類 |
CandidatesViewManager.java |
候選欄界面管理器的基類 |
CandidateTextView.java |
繼承TextView,各候選詞的裝載容器 |
CandidateViewButton.java |
繼承Button,同上 |
ComposingText.java |
用於處理提交文本的工具類 |
DefaultSoftKeyboard.java |
繼承InputViewManager,用於處理各鍵盤的操作交互邏輯的基類 |
InputViewManager.java |
定義了鍵盤管理器中通用的管理接口 |
KeyAction.java |
按鍵動作實體類 |
Keyboard.java |
鍵盤佈局的解析工具類 |
KeyboardView.java |
繼承View,繪製鍵盤的自定義佈局類 |
LetterConverter.java |
定義了文字轉換工具相關的接口 |
OpenWnn.java |
繼承於InputMethodService,輸入法服務的實現基類,處理通用操作 |
OpenWnnEN.java |
繼承於Openwnn類,英文輸入法服務實現類,處理英文輸入法[暫未使用] |
OpenWnnJAJP.java |
繼承於Openwnn類,日語輸入法服務實現類,處理日語輸入法邏輯 |
TextCandidates1LineViewManager.java |
繼承於CandidatesViewManager,一行式候選框的實現邏輯 |
TextCandidatesViewManager.java |
繼承於CandidatesViewManager,多行式候選框的實現邏輯 |
DefaultSoftKeyboardJAJP.java |
繼承於DefaultSoftKeyboard,用於處理日語輸入法鍵盤中的交互邏輯,如輸入事件分發,切換輸入模式等等 |
IPersenter.java |
P層業務接口定義 |
IPerserterImpl.java |
繼承於IPersenter .P層業務接口實現類 |
AutoSetsProxy.java |
於AutoCore交互的代理類 |
…… |
其他類暫不介紹 |
部分改動修改記錄說明
3.1 針對項目需求增加換膚功能
換膚功能由於輸入法的特殊性輸入法服務啓動快於AutoCore,快於換膚模塊啓動,且輸入法佈局是以window形式存在所以無法使用通用的調用相關模塊進行換膚,目前主要實現邏輯如下:
3.1.1 定義全局變量mSkin通過讀取Setting中的值獲取皮膚的值從而確定使用皮膚爲哪一套
相關代碼如下[ /src/com/soling/inputMethod/OpenWnn.java OnCreate()方法中]:
mSkin =Settings.System.getString(getContentResolver(),"zjb");
3.1.2 定義一個獲取接口供給各類使用
相關代碼如下[ /src/com/soling/inputMethod/OpenWnn.java]:
public String getmSkin(){
return TextUtils.isEmpty(mSkin)?SKIN_FUTURE:mSkin;
}
3.1.2 通過上面提供方法在有關佈局加載的地方修改佈局邏輯
例如:
鍵盤大背景修改,代碼如下[ /src/com/soling/inputMethod/DefaultSoftKeyboard.java initView()方法中]:
mSkin = parent.getmSkin();
if (mSkin != null)
if (mSkin.equals(OpenWnn.SKIN_GIRL)) {
skin = "keyboard_simple";
} else if (mSkin.equals(OpenWnn.SKIN_STABLE)) {
skin = "keyboard_matla";
} else if (mSkin.equals(OpenWnn.SKIN_FUTURE)) {
skin = "keyboard_tech";
}
……
int id = parent.getResources().getIdentifier(skin, "layout", "com.soling.inputMethod");
mKeyboardView = (KeyboardView)mWnn.getLayoutInflater().inflate(id, null);
鍵盤候選框背景修改,代碼如下
[ /src/com/soling/inputMethod/TextCandidates1LineViewManager.java initView()方法中]
mSkin = parent.getmSkin();
ll_candidatetext.setBackgroundResource(R.drawable.keyboard_words_display_bg);
if(mSkin!=null){
if(mSkin.equals(OpenWnn.SKIN_GIRL)){
ll_candidatetext.setBackgroundResource(R.drawable.keyboard_words_display_bg);
}elseif(mSkin.equals(OpenWnn.SKIN_STABLE)){
ll_candidatetext.setBackgroundResource(R.drawable.matla_keyboard_words_display_bg);
}elseif(mSkin.equals(OpenWnn.SKIN_FUTURE)){
ll_candidatetext.setBackgroundResource(R.drawable.tech_keyboard_words_display_bg);
}
}
……其餘換膚[鍵盤按鍵,候選詞等等]邏輯雷同不再舉例寫出。
3.2 針對項目需求增加行車警告功能
由於項目需求輸入法在行車時不允許使用,需要出現彈框提示,主要實現邏輯如下:
3.2.1 通過AutoCore獲取當前行車狀態,並且對行車狀態實時監聽
AutoCore獲取當前行車狀態的接口爲:isParking();
通過代理類在每次顯示調用輸入法時候去獲取一次行車狀態作爲初始化狀態值,代碼如下[/src/com/soling/inputMethod/OpenWnn.javaonWindowShown()方法中]:
if(mPersenter!=null)
isParking = mPersenter.isParking();
if (mInputViewManager != null)
if(!isParking){
((DefaultSoftKeyboard)mInputViewManager).showDialogInkeyboard(true);
}else{
(DefaultSoftKeyboard)mInputViewManager).showDialogInkeyboard(false);
}
註冊監聽接口後回調爲: onParkingResponse(int brakeStateFromMcu)
該回調通過P層傳達到輸入法應用服務層,交由應用服務層進行處理具體情況
代碼如下 [/src/com/soling/inputMethod/OpenWnn.java]:
public void onParkingResponse(int brakeStateFromMcu){
isParking = (brakeStateFromMcu>0);
if(mInputViewManager!=null)
if(!isParking){
((DefaultSoftKeyboard)mInputViewManager).showDialogInkeyboard(true);
}else{
((DefaultSoftKeyboard)mInputViewManager).showDialogInkeyboard(false);
}
}
3.2.2 顯示以及隱藏邏輯,主要在DefaultSoftKeyboard裏面處理,其內部封裝了showDialogInkeyboard方法對其顯示和隱藏進行處理,通過發送Handler消息對UI進行處理。
代碼如下[/src/com/soling/inputMethod/DefaultSoftKeyboard.java]:
public void showDialogInkeyboard(boolean isShow) {
if (handler != null) {
Message msg = handler.obtainMessage();
if (mWnn != null) {
if (isShow) {
isShowDialogTv = true;
if (mMainRl != null)
mViewGroup=(ViewGroup) mMainRl.getParent().getParent();
if (handler.hasMessages(MSG_SHOW_POP))
handler.removeMessages(MSG_SHOW_POP);
msg.what = MSG_SHOW_POP;
handler.sendMessage(msg);
} else {
isShowDialogTv = false;
if (handler.hasMessages(MSG_HIDE_POP))
handler.removeMessages(MSG_HIDE_POP);
msg.what = MSG_HIDE_POP;
handler.sendMessage(msg);
}
}
}
}
在handler進行重新計算大小然後顯示和隱藏popwindow彈框,因爲存在界面忙於接口show出來的問題,可能會出現錯誤,因此handler中進行了一個50ms的重發處理機制,具體代碼查看源碼[/src/com/soling/inputMethod/DefaultSoftKeyboard.javaMyHandler內部類中]。
3.3 切換語言後輸入法彈框的行車警告框文字未變更問題處理
由於語言切換後popwindow的界面內容沒有更新所以導致文字沒有變更,所以處理機制爲註冊語言變換的廣播接收器,當收到語言切換的廣播後重新加載popwindow界面,具體代碼如下:
[/src/com/soling/inputMethod/OpenWnn.java]
public class LocaleChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_LOCALE_CHANGED)) {
if(mInputViewManager!=null)
((DefaultSoftKeyboard)mInputViewManager).updatePopWindow();
}
}
}
[/src/com/soling/inputMethod/OpenWnn.java onCreate()方法中註冊廣播接收器]
changeReceiver = new LocaleChangeReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_LOCALE_CHANGED);
registerReceiver(changeReceiver, filter);
[/src/com/soling/inputMethod/DefaultSoftKeyboard.java updatePopWindow()重新加載界面]
if(handler!=null){
if (handler.hasMessages(MSG_UPDATA_POP))
handler.removeMessages(MSG_UPDATA_POP);
handler.sendEmptyMessage(MSG_UPDATA_POP);
}
3.4 屏蔽預覽彈框以及長按彈框
原版代碼中輸入法鍵盤觸摸後會顯示相應預覽彈框以及部分按鍵候選詞長按後會有彈框出現,由於不符合設計需求因此將其相關方法屏蔽。具體如下:
3.4.1 屏蔽預覽彈框:
[/src/com/soling/inputMethod/DefaultSoftKeyboard.java setPreferences方法中將值設爲false即不可使用]
……
if (OpenWnn.isXLarge()) {
mKeyboardView.setPreviewEnabled(false);
} else {
mKeyboardView.setPreviewEnabled(pref.getBoolean("popup_preview",
false));
mKeyboardView.clearWindowInfo();
}
3.4.2 屏蔽候選詞長按後出現彈框:
[/src/com/soling/inputMethod/TextCandidates1LineViewManager
.java以及TextCandidatesViewManager.java]中屏蔽有關於displayDialog(v, mWord);方法的調用
或者在[/src/com/soling/inputMethod/CandidatesViewManager] 將displayDialog方法中的操作進行屏蔽
3.5 有關於鍵盤按鍵輸入事件的分析
鍵盤按鍵的處理首先在KeyboardView.java中進行觸摸(onTouch)事件的處理,其中涉及到長按,滑動等等特殊處理,當手指擡起後若符合條件則將按鍵事件傳遞給DefaultSoftKeyboard.java的子類[DefaultSoftKeyboardJAJP.java]中onKey事件中處理一系列事件,如切換鍵盤輸入模式,輸入文字等等事件的處理,裏面根據所傳的primaryCode【該值其實就是鍵盤實體類中的KeyCode】參數進行事件分類處理。切換鍵盤輸入模式在該類中封裝好了方法調用,而與輸入文字相關的則進一步的傳遞給OpenWnn.java的子類[OpenWnnJAJP.java]中的onEvent事件進行相關事件處理。
3.6 五十音鍵盤功能開發
出於日本客戶需求需要定製一個五十音全鍵鍵盤。
首先是定製鍵盤的佈局,輸入法鍵盤主體佈局是由xml文件夾裏各個.xml寫成,文件書寫格式其實就是自定義View佈局書寫方式具體內容可以查看源代碼進行學習,自定義五十音相關的keycode值以及定義相應顯示文本字符串,修改準備拿來替換的佈局文件【注:AVN項目中修改了全角英文(FULL_ALPHABET)和全角數字(FULL_NUMBER)的鍵盤佈局文件用來替換成五十音平假名和片假名的佈局,借用兩個存在的佈局作爲改寫可以省下很多邏輯修改,如要真的新增兩個鍵盤,則需要按照整體框架下修改大幅度的切換邏輯】,修改完的xml將會通過Keyboard.java類進行數據解析生成各個鍵盤的實體類數據,然後通過keyboardView繪製展示出來。接下來則按照3.5所描述內容進行事件處理,增加新的Event事件書寫新的case分支處理相關輸入邏輯。