BREW輸入法適配小結

花了兩個禮拜的時間適配了幾十個手機的輸入法,總結了幾個適配成功的關鍵點。

 

1、標準模式

  我稱採用ITEXTCTL_SetSoftKeyMenu進行輸入法選擇的方式爲標準模式,因爲大部分事情都是API替你做了。但是對於這種模式,有一些地方API Reference裏並沒有說清楚,比如兩個控件ITEXTCTL、IMENUCTL,各自的HandleEvent函數應如何調用,就沒有找到標準的說明。我採用的是如下的調用方式:

 

IMENUCTL_HandleEvent(pme->m_pITextCtl,eCode,wParam,dwParam);

ITEXTCTL_HandleEvent(pme->m_pITextCtl,eCode,wParam,dwParam);

 

  即依次調用兩個控件的HandleEvent函數。之前還採用過先處理ITEXTCTL_HandleEvent,如果該函數返回值爲FALSE,再處理IMENUCTL_HandleEvent的方式。但試驗發現前一種方式適配的手機更多。對於因採用該方式出現問題的手機,再做特殊處理。

 

  另外請將所有事件都傳給這兩個控件的HandleEvent函數處理,而不只是傳入按鍵或觸摸事件。

 

2、文本框大小

  ITEXTCTL控件大小對屏幕能否正常刷新有着重要影響。例如三星手機文本框不能過大,否則候選框顯示會有問題;個別手機文本框又不能顯示過小,否則軟鍵盤無法顯示,甚至手機直接重啓。最後的處理方式是三星手機文本框高度爲80~100,其餘手機文本框加上底部菜單滿屏顯示。

 

3、中斷恢復

  之前出現了各種問題。比如標準模式下的符號輸入法、輸入法切換菜單、華爲等手機的手寫輸入框,都出現了中斷後調用ITEXTCTL_Redraw無法正常刷新的bug。如果在中斷事件EVT_SUSPEND來到時複製屏幕到一張內存位圖,中斷恢復後將這張內存位圖繪製到屏幕,並且中斷和恢復時均不改變ITEXTCTL的Active狀態,便可以解決這類問題。但這種方式在個別手機上又會引出新問題,例如有些手機中斷前後輸入法狀態會改變,保存屏幕位圖的方法不適用。因此將中斷恢復分爲3種情況:

a.保存屏幕位圖,resume時用這張位圖重畫屏幕。這種情況適於大部分手機。

b.resume時調用ITextCtl_Redraw重畫屏幕。這種手機包括Coolpad2938/nokia8208/中興C3621/中興S189/華爲C5600/摩托W562。

c.suspend時設置文本框Active狀態爲FALSE,resume時設置Active狀態爲TURE,並調用ITextCtl_Redraw重畫屏幕。這種手機極少,記不清了。

 

4、EVT_CTL_TEXT_MODCHANGED事件

  這個事件表示輸入方式發生了改變。個別手機在這個事件發生時需要調用ITEXTCTL_Redraw函數重繪,否則刷新不正常(可能是其它地方設置不對導致的,但是我沒有找到直接原因)。目前發現有問題的手機有CORISE KS958K/中興S189,這兩款手機發生EVT_CTL_TEXT_MODCHANGED事件時需要立即重繪。更特殊的是中興手機觸摸屏手機R501/R630,發生這個事件後需要延時幾毫秒後再調用ITEXTCTL_Redraw事件,纔可以正常刷新。

 

5、AVK_CLR與AVK_SOFT2

  有些手機只有AVK_SOFT2鍵,而按該鍵竟然無法刪除文本框或候選框裏的文字,這可真是OEM的大bug。對於這種手機,接收到AVK_SOFT2的按鍵事件時,手動將wParam改爲AVK_CLR可以解決問題。目前發現問題的手機是nokia8208

 

6、對於需要支持默認輸入法的應用,請搞清輸入法序號在手機上的正確編號。一般五種常用的輸入法編號是:

 

數字=5

字母=3

拼音=9

筆畫=10

符號=2

 

  但有一些觸摸手機編號是從八十幾開始的;一些手機有多於5種的輸入法。建議出現問題時,採用標準模式切換輸入法,並用ITEXTCTL_GetInputMode方法得到當前輸入法的編號。

 

7、一些特殊情況

 

a.有候選字的情況下,按AVK_END鍵無法退出應用。試驗發現,這時這些手機會發送EVT_USER事件。wParam參數愛國者手機是0x4c9,其餘手機(Evertel EV701/QIGI V60)爲0x4b4。接收到這種事件時強制退出程序即可。

 

b.和信I01,手寫輸入完成時會有黑色矩形覆蓋在文本控件上方,需要重繪標題欄。重繪的時機是收到eCode爲0x5beb的事件時。

 

c.諾基亞8208手機,選定或者取消候選字時,會發送EVT_DIALOG_END事件,需要手動調用ITEXTCTL_Redraw函數,清掉候選框。

 

d.三星手機拼音/筆畫/符號輸入時,底部的聯想字候選菜單有很大問題。有時顯示不出來,但按鍵會出字;光標位於行首時又無法去掉聯想字候選框。第一個問題軟件超市中的搜索也有,不打算改了;第二個問題仿照軟件超市的搜索,光標位於行首時,按AVK_CLR直接視爲取消輸入,可能會引起其它問題,一段目前起作用的代碼如下:

 

if(ITEXTCTL_GetCursorPos(pme->m_pITextCtl) == 0)

{

ITEXTCTL_SetInputMode(pme->m_pITextCtl,9);

ITEXTCTL_HandleEvent(pme->m_pITextCtl,EVT_KEY,AVK_POUND,0);

ITEXTCTL_SetText(pme->m_pITextCtl,NULL,-1);

......取消輸入......

}

 

8、輸入法bug較多,遇到問題可以先和軟件超市裏的搜索對比,只要做到和它一致就好了。

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