日語輸入法(OpenWnn)的代碼學習以及修改記錄

目錄

文件目錄結構

各類功能說明

部分改動修改記錄說明

3.1 針對項目需求增加換膚功能

3.2針對項目需求增加行車警告功能

3.3切換語言後輸入法彈框的行車警告框文字未變更問題處理

3.4 屏蔽預覽彈框以及長按彈框

3.5 有關於鍵盤按鍵輸入事件的分析

3.6 五十音鍵盤功能開發

  

文件目錄結構:

/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分支處理相關輸入邏輯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章