以下内容于 2014年4月整理
============================
关于输入法的结构:
【输入法】
pakage softkeyboard 是一个程序包,其中包含几个平行的类。
1. SoftKeyboard extends InputMethodService
implements <Latin>KeyboardView.OnKeyboardActionListener
1.1 <Latin>KeyboardView mInputView
1.2 LatinKeyboard mStrokesKeyboard
1.3 getCurrentInputConnection()
此物可以sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keyEventCode));
以下都是硬键盘函数。
1.4 override 3函数
1.4.1 onKeyDown(int keyCode, KeyEvent event)
1.4.2 onKeyUp(int keyCode, KeyEvent event)
1.4.3 onKeyLongPress(int keyCode, KeyEvent event)
1.5 keyDownUp(int keyEventCode),纯粹送出keyevent
1.6 sendKey(int keyCode) 送出keyDownUp keyevent 或字符上屏
1.7 translateKeyDown(int keyCode, KeyEvent event) 调用onKey
【键盘视图】
2. LatinKeyboardView extends KeyboardView
2.1 KeyboardView有一个私有成员,只能通过getOnKeyboardActionListener()获取。
但其成员函数在SoftKeyBoard中实现。共有8个函数:
2.1.1 onKey(int primaryCode, int[] keyCodes)
注意,onKey代码在1中,并且又调用1的handlecharacter,后者正是核心程序。
2.1.2 onPress(int primaryCode),其中改变键值,也可以改变按键lable。
mStrokesKeyboard.getKeys().get(5).codes[0]=KEY_ESC;
mStrokesKeyboard.getKeys().get(3).label="丿";
注意此改变是即时的,发生在 onkey 之前。
2.1.3 onRelease(int primaryCode)
2.1.4 onText(charsequence)
2.1.5 SwipeRight()
2.1.6 SwipeLeft()
2.1.7 SwipeUp()
2.1.8 SwipeDown()
2.2 重载onLongPress,注意这不是KeyboardActionListener的函数,
而是调用getOnKeyboardActionListener().onKey()向屏幕输出不同于短按的字符。
遗憾的是,不能在此函数中修改键值和lable并使屏幕显示即时刷新,也许dirty可以。
但这并不重要,因为longpress体验并不好。
2.3 也有.onKeyDown(keyCode, event),onKeyUp,onKeyLongPress,可能都被1.4节取代了。
2.3 setPreviewEnabled 用来设置是否显示按键预览
2.x 在 google pinyin 中,该类extends View,具有3个函数
2.x.1 onKeyPress(int x, int y,
SkbContainer.LongPressTimer longPressTimer, boolean movePress)
2.x.2 onKeyRelease(int x, int y)
2.x.3 onKeyMove(int x, int y),调用onKeyPress,key的moveWithinKey(int x, int y)
在 键盘 类中,有mapToKey(int x, int y)用于把坐标转换为按键。
2.x.4 以上3函数在SkbContainer中onTouchEvent中被调用。
SkbContainer implements OnTouchListener
onTouchEvent 用来给 mSoftKeyDown 赋值,然后((PinyinIME) mService).responseSoftKeyEvent(mSoftKeyDown);
在 SkbContainer 中,private InputMethodService mService;
在 PinyinIME 中,private SkbContainer mSkbContainer;
mSkbContainer = (SkbContainer) inflater.inflate(R.layout.skb_container,
null);
mSkbContainer.setService(this);
mSkbContainer.setInputModeSwitcher(mInputModeSwitcher);
mSkbContainer.setGestureDetector(mGestureDetectorSkb);
2.x.4 未使用OnKeyboardActionListener。
【键盘和键】
3. LatinKeyboard extends Keyboard
3.1 LatinKey extends Keyboard.Key
3.1.1 onPressed() 重绘按键
3.1.2 onReleased(boolean inside) 根据是否字在该按键处释放而重绘。
3.1.3 overide isInside(int x, int y)
3.x moveWithinKey(int x, int y) google pinyin 单独一个文件全新定义未extend自其他类。
3.2 createKeyFromXml,根据触摸坐标,从xlm生成一个key,并作一些初始化设置,例如改变icon
非也,在初始化时遍历所有按键。
3.3 Key mEnterKey;
3.x google pinyin 中也是全新定义了一个SoftKeyboard类。使用SkbPool和XmlKeyboardLoader组合导入键盘
【软键盘响应按键的顺序】
1. <Latin>KeyboardView.OnKeyboardActionListener.onPress()
此时可修改键值,lable
2. <Latin>KeyboardView.onLongPress()
<Latin>KeyboardView.getOnKeyboardActionListener().xxx()
3. <Latin>KeyboardView.getOnKeyboardActionListener().onKey()
SoftKeyBoard.handlecharacter()
4. <Latin>KeyboardView.OnKeyboardActionListener.onRelease()
上文发布于 2018-06-16 23:51:25
20210718修改:去掉了注释符号。