android输入法02:openwnn源码解析01—输入流程(甘松青)

来源:互联网 发布:怎么在mac上使用office 编辑:程序博客网 时间:2024/04/30 16:27

      本文由甘松青修改。     

     之后要开始android日文输入法的测试,因此现在开始研究android输入法。之前两篇文章已经对android自带的输入法实例softkeyboard的源码进行了解析。这一系列将开始学openwnn的源码。

       openwnn是一家日本公司开发的开源输入法框架,涉及中文、日文、韩文。目前已经加入到了android源码之中。因此你打开一个模拟器时,会发现其中有一个japanese ime的输入法,其服务名为openwnn,这个就是openwnn的日文输入法。

        网上流传的openwnn源码后端都没有处理(将c转为so文件),所以都是不可直接生成可运行apk的。我编译了下C代码后的源码下载地址为:http://download.csdn.net/detail/xianming01/4308456(我用的NDK比较新,所以要在android4.0的系统上才可以运行)

1、日文输入

       本文章主要以日文输入法为主。为了方便大家阅读,先对日文输入法做一个简单的介绍:

  •  日文输入法分为罗马音输入法(类似中文拼音)和假名输入法(类似中文五笔、)。比如,你要输入”可愛“,则用罗马音输入,需要输入”kawai“,然后在候选词中选择”可愛“;若使用假名输入,则需要输入”かわい“,在候选中选择”可愛“。
  • 日文由平假名、片假名(分全角片假名和半角片甲名)和汉字组成。通常学日语的人会说到50音图,就是日语50个平假名(与之对应有50个片假名)的读音。其中平假名是由汉字演化而来的,类似于日文的拼音,比如”可愛“的日文读音就是”かわい“。片假名是由于外来语的入侵,原来平假名无法表达所有的外文内容而设计的。
       这里,如果你读到ComposingText.java这个类时,其中会涉及到三个输入层:第一层为原始输入,比如输入的按键;第二层为假名层;第三层为最终显示结果,一般为汉字与假名的混合体。以前面那个例子,在罗马音输入法模式下,第一层为”kawai“,第二层为”かわい“,第三层为”可愛“。若你不懂日文的一些基本特点,这一个地方有可能看不懂。

2、输入流程
2.1 android输入法输入流程
      现在我们开始介绍输入流程。从前面的文章对softkeyboard的分析(若你对输入法不了解,请看前两篇介绍softkeyboard的文章,否则后面的内容很难看懂),我们可以知道,输入法包括四个部分:Keyboard,KeyboardView,CandidateView,InputMethodService。其中InputMethodService是前面三者的使用者,同时也设定了输入流程。android输入法的调用流程如下:

       输入法在Android中的本质就是一个Service,假设用户刚刚启动Android,用户移动焦点首次进入文本编辑框时,Android便会通知Service开始进行初始化工作。于是便有了如图中的一系列动作。
       追根溯源,onCreate方法继承至Service类,其意义和其他Service的是一样的。Sample在这里,做了一些非UI方面的初始化,即字符串变量词汇分隔符的初始化。
接下来执行onInitializeInterface,这里是进行UI初始化的地方,创建以后和配置修改以后,都会调用这个方法。Sample在这里对Keyboard进行了初始化,从XML文件中读取软键盘信息,封装进Keyboard对象。
       第三个执行的就是onStartInput方法,在这里,我们被绑定到了客户端,接收所有关于编辑对象的详细信息。
       第四个执行的方法是onCreateInputView,在用户输入的区域要显示时,这个方法由框架调用,输入法首次显示时,或者配置信息改变时,该方法就会被执行。在该方法中,对inputview进行初始化:读取布局文件信息,设置onKeyboardActionListener,并初始设置 keyboard。
       第五个方法是onCreateCandidatesView,在要显示候选词汇的视图时,由框架调用。和onCreateInputView类似。在这个方式中,对candidateview 进行初始化。
       第六个方法,也是最后一个方法,即onStartInputView,正是在这个方法中,将inputview和当前keyboard重新关联起来。
       在上面的六个方法中,onCreateInputView和onCreateCandidatesView两个方法只有在初始化时才会执行一次,除非有配置信息发生改变。那么究竟什么是配置信息发生改变呢?在看InputMethodService的API文档时,可以看到有一个方法onConfigurationChanged,根据文档解释,这个方法主要负责配置更改的情况。
2.2 相关类分析
       openwnn中对上面这些流程的控制来自于两个类OpenWnn.java和OpenWnnJAJP.java,其中前者是通用接口,后者是对日文输入法的定制版。我们看一下第一个类OpenWnn.java。

        其中的变量包括如下部分:
[java] view plaincopy
  1. /** Candidate view */  
  2. protected CandidatesViewManager  mCandidatesViewManager = null;  
  3. /** Input view (software keyboard) */  
  4. protected InputViewManager  mInputViewManager = null;  
  5. /** Conversion engine */  
  6. protected WnnEngine  mConverter = null;  
  7. /** Pre-converter (for Romaji-to-Kana input, Hangul input, etc.) */  
  8. protected LetterConverter  mPreConverter = null;  
  9. /** The inputing/editing string */  
  10. protected ComposingText  mComposingText = null;  
  11. /** The input connection */  
  12. protected InputConnection mInputConnection = null;  
  13. /** Auto hide candidate view */  
  14. protected boolean mAutoHideMode = true;  
  15. /** Direct input mode */  
  16. protected boolean mDirectInputMode = true;  
  17.    
  18. /** Flag for checking if the previous down key event is consumed by OpenWnn  */  
  19. private boolean mConsumeDownEvent;  
[java] view plaincopy
  1. /** Candidate view */  
  2. protected CandidatesViewManager  mCandidatesViewManager = null;  
  3. /** Input view (software keyboard) */  
  4. protected InputViewManager  mInputViewManager = null;  
  5. /** Conversion engine */  
  6. protected WnnEngine  mConverter = null;  
  7. /** Pre-converter (for Romaji-to-Kana input, Hangul input, etc.) */  
  8. protected LetterConverter  mPreConverter = null;  
  9. /** The inputing/editing string */  
  10. protected ComposingText  mComposingText = null;  
  11. /** The input connection */  
  12. protected InputConnection mInputConnection = null;  
  13. /** Auto hide candidate view */  
  14. protected boolean mAutoHideMode = true;  
  15. /** Direct input mode */  
  16. protected boolean mDirectInputMode = true;  
  17.    
  18. /** Flag for checking if the previous down key event is consumed by OpenWnn  */  
  19. private boolean mConsumeDownEvent;  
        这些变量的作用如文字说明。其中跟我们需要介绍相关的是InputViewManager和CandidatesViewManager,前者负责维护Keyboard和KeyboardView,后者负责维护CandidateView。
        从这个类的方法中我们可以到其中主要是输入法生命周期方法以及输入法处理。
        下面我们来看看OpenWnnJAJP.java,其中的公用方法为:


        从这些方法中我们可以看到,这些方法主要也是应用输入法的处理流程中。有需要的同学可以按照第一张输入法流程图对应的类来看看相关的函数代码,就可以对其输入法流程有比较深刻的认识。
       本文由甘松青修改。     
0 0
原创粉丝点击