Android 原生输入法示例代码分析

以下内容于 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修改:去掉了注释符号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值