图形绘制模块最主要的就是提供绘图功能,实现绘制方块和界面,控制方块移动并响应按键事件,控制按键与方块之间的同步等方法。
3.5 输入法的流程设计
用户在应用输入法时,输入法的运行的流程图如图3-5所示。输入法在应用的过程中会按照用户的选择进行判断用户所需要输入的是汉字,大写的英文,小写的英文还是想要输入标点符号,以及输入标点符号的过程中需要输入的是全角标点还是半角标点。按照用户的选择输入法会显示不同的界面。当用户输入了错误的文字可以选择删除,当用户对已经输入的文本发现前面有输入的错误后漏掉一些文字是可以移动光标到想要修改的地方进行修改。
图3-5 输入法运行的流程图
3.6 主要模块的概要设计
3.6.1 输入法控制模块与文字库模块的概要设计
对于同一个输入消息,不同输入方式下的输入法往往需要不同的逻辑处理。如图3-6所示。
图3-6 输入法控制模块
本设计中,采用了树形结构作为数据结构。树结构是一类重要的非线性数据结构。其中以树二叉树最为常用,直观看来,树是以分支关系定的层次结构,其整体结构如图3-7所示。图3-7是一个树形的层次结构,这里假设第一次下的是“2”键,因而此结构的根尾“2”。由于“2”键对应的字母“abc”在汉语拼音中均可作第一个字母,因此其子树有3 个。同样下面的结构也是如此,都是本结点以及前面的父结点组合后可能的拼音,比如“ai”、“an”都是有可能的拼音,因此“i”,“n”作为“a”的子结点;而“bai”、“ban”也是成立的,所以在“b”后放一“a”结点,在“a”结点后放“i”和“n”作为“a”的子结点。
图3-7 层次结构图
由于手机数字键盘输入时,一个按键对应多个字母,所以在输入时就有可能记录多个结点。如果用户第一次按下“2”键,经按键与字符转换程序后,就必须对“a”、“b”、“c”查找。显而易见,其结果必定是根结点的子结点“a”、“b”、“c”均符合要求。故搜索程序记录了这3个结点。若现在用户需要查找字母“a”,则必须分别从这3个结点出发来查询其各子结点。由此设计输入法的搜索算法如图3-8。
图3-8 搜索算法流程如
3.6.2 输入法客户端概要设计
客户端的主要功能是接收用户输入,根据输入码获取候选字词供用户选择,并将最终用户选择的文木发送到目标窗口中。客户端框架图如图3-9。
图3-9 客户端设计模块
在本设计中使用的模拟器的按钮控件作了23个按钮。左右键:选择列表中拼音;上下键:对同一拼音的汉字序列翻页;‘*’键:输入标点符号;“2”到“9”键:用于输入拼音或确认时的选择;“确认”键:找到目标汉字后的确认输入;“0”按钮:取消输入的拼音或删除输入文本。下面就左右键作简单介绍,流程如图 3-10 所示。
图3-10 左右键操作简介
由于数字键盘中1个数字键对应多个字母,因此在用户输入的过程中必然会生成许多键盘按键方式相同,但拼音不同的汉字。 而用户需要的拼音又往往不是第一个,因此需要用1 对左右键进行选择。 主要是使用了 个标志UDorder,通过它对保存在数组中的查询结果进行选择。
3.5 本章小结
本章对整个课题的主要模块也框架进行了概要的分析。针对拼音输入法系统这一具体课题,进行了概要的设计分析,为后续章节的模块设计奠定了基础。在以上分析的同时,本章得出了一个合理的软件结构,这对软件的整体布局和深入理解,有很大的作用。总之,本章内容讲述的是软件设计和具体实现前的重要步骤,合理的软件需求分析,会给后续的开发带来极大的便利。
第四章 输入法的详细设计与实现
整个输入法分为3大模块,分别是文字库处理模块,输入法输入处理模块,主控制模块,下面分别对其进行详细的分析。
4.1 输入法的文字库处理模块的设计
文字库处理模块是本文档研究的重点,主要涉及到文字库的设计,按键事件的处理,对输入的拼音的搜索与匹配。该模块的类结构主要由CharLibrary_1类,CharLibrary_2类,CharLibrary_3类,Spell2Chars类,等四大类构成。
CharLibrary_1类,CharLibrary_2类,CharLibrary_3类中设计汉字库,每组汉字由对应的汉语拼音索引,根据传递过来的输入法虚拟按键来处理按键。
Spell2Chars类根据拼音选择汉字组获得该拼音下的汉字序列如果拼音为空,就返回空否则取拼音的长度并把拼音的每个字符放在定义的一个数组里里然后根据不同长度拼音不同处理。在此模块中同样要在处理判断当前的输入状态。如果是汉字输入状态,则把它发送给汉字输入处理模块,它调用汉字编码转换引擎来处理。如果是其他输入状态,则把它发送给英文数字处理模块,它调用英文数字转换引擎来处理。(1)汉字处理模块:把 0-9 对应的候选汉字发送给应用程序,同时汉字编码转换引擎中的编码清0。然后调用汉字编码转换引擎的缓存调整模块,把选择的汉字调整到缓存词组的第一个位置。当按键为后退键时,删除汉字编码转换引擎中的最后一个编码,然后用删除后的编码搜索,并把搜索结果通过候选窗口显示出来。(2).数字输入时,当按键0-9 号键、#号键和*号键时,直接把按键对应的字符‘0’-‘9’,‘*’,‘#’发送给应用程序。当按键为后退键时,删除上一个输入字符。其他按键不进行处理。(3).英文输入时,当前按键与上一个按键不同时,当前按键为*则进入符号输入模式,当前按键不为*时则退出符号输入模式。然后把当前编辑字符串里的字符发送给应用程序。主要是因为英文输入时支持多重按键(即按下 2 号键输入字母a,再按一下输入字母b),这些多重按键字符是保存在编辑字符串中的,所以要把这些编辑字符串中的内容发送到应用程序,再存放新的字符,以避免被新的字符覆盖。当前按键为0号键时,直接发送字符‘0’给应用程序。当前按键为#号键时切换英文大小写模式。当前按键为后退键时,如果编辑字符串中有字符,则删除编辑字符串中的字符,如果编辑字符串中没有字符,则删除应用程序中的一个字符。当前按键为*键时,获取下一个符号。把它放到编辑字符串中。当前按键为 2-9 号键时,根据当前按键、上一个按键和当前大小写输入模式,获取当前输入字符放到编辑字符串中。其他按键,当前编辑字符串中有字符时,把当前编辑字符串中的字符发送给应用程序。不对按键进行其他任何处理。
CharLibrary_1类,CharLibrary_2类,CharLibrary_3类,Spell2Chars类,这四个类的类图如图4-1所示
图4-1 CharLibrary_1类、CharLibrary_2类、CharLibrary_3类、Spell2Chars类类图
本模块时本次设计的重点,根据输入法此模块设计的结果对各个类进行编码实现。考虑到此模块的整体代码行非常长,在此仅对部分关键代码进行分析。Spell2Chars类中getInput2Spell函数实现拼音索引表,拼音索引表根据不同的内码转换为相应的拼音。其相应的代码如下:
public static String getInput2Spell(int spellNumber)
String result = null;
if(spellNumber == 100)
result = "半角 全角";
else
if(spellNumber == 6826)
result = "NUAN";
else
if(spellNumber == 468)
result = "GOU HOU";
else
if(spellNumber == 5364)
result = "KENG LENG";
else
if(spellNumber == 268)
result = "COU";
else
if(spellNumber == 264)
result = "ANG";
else
if(spellNumber == 6426)
result = "MIAN MIAO NIAN NIAO";
else
if(spellNumber == 3664)
result = "DONG";
else
if(spellNumber == 0x1244a)
result = "SHUAN";
else
if(spellNumber == 0x12448)
result = "SHUAI";
else
if(spellNumber == 3464)
result = "DING";
类public class CharsLibrary_1,public class CharsLibrary_2 ,public class CharsLibrary_3,存储了本次输入法设计的文字库。本次定义一个字符数组存储每组拼音所对应的汉字。并通过unsigned char mge_ime char * mgePY_ime_mb实现了在拼音索引表中检索匹配的索引,通过索引检索到相应的汉字数组。文字库部分代码如下:
public class CharsLibrary_1 {
private CharsLibrary_1(){
}
public static final char[] A = {
'啊','阿','呵','吖','嗄','腌','锕'};
public static final char[] AI = {
'爱','矮','挨','哎','碍','癌','艾','唉','哀','蔼','隘','埃','皑','呆','嗌','嫒','瑷','暧','捱','砹','嗳','锿','霭','乃','剀','呃','噫','奇','阂'};
public static final char[] AN = {
'按','安','暗','岸','俺','案','鞍','氨','胺','厂','广','庵','揞','犴','铵','桉','谙','鹌','埯','黯','干','盒','钳','顸'};
public static final char[] ANG = {
'昂','肮','盎','仰'};
public static final char[] AO = {
'袄','凹','傲','奥','熬','懊','敖','翱','澳','嚣','拗','媪','廒','骜','嗷','坳','遨','聱','螯','獒','鏊','鳌','鏖','岙','噢','棍','浇'};
public static final char[] BA = {
'把','八','吧','爸','拔','罢','跋','巴','芭','扒','坝','霸','叭','靶','笆','疤','耙','捌','粑','茇','岜','鲅','钯','魃','菝','灞','伯','捭','杷','湃','萆'};
public static final char[] BAI = {
'百','白','摆','败','柏','拜','佰','伯','稗','捭','呗','掰','扒','排','派','薜','鞴'};
public static final char[] BAN = {
'半','办','班','般','拌','搬','版','斑','板','伴','扳','扮','瓣','颁','绊','癍','坂','钣','舨','阪','瘢','分','彬','豳','辨','辩'};
public static final char[] BANG = {
'帮','棒','绑','磅','镑','邦','榜','蚌','傍','梆','膀','谤','浜','蒡','彭','旁','纺','螃'}; public static final char[] BAO = {
'包','抱','报','饱','保','暴','薄','宝','爆','剥','豹','刨','雹','褒','堡','苞','胞','鲍','炮','瀑','龅','孢','煲','褓','鸨','趵','葆','勹','呆','簿','袍','裒'};
public static final char[] BEI = {
'被','北','倍','杯','背','悲','备','碑','卑','贝','辈','钡','焙','狈','惫','臂','褙','悖','蓓','鹎','鐾','呗','邶','鞴','孛','陂','碚','俾','埤','怫','波','菩','萆','葡','蜚','跋'};
public static final char[] BEN = {
'本','奔','苯','笨','夯','锛','贲','畚','坌','体'};
public static final char[] BENG = {
'蹦','绷','甭','崩','迸','蚌','泵','甏','嘣','俸','傍','唪','堋','平','抨','旁','榜'};
public static final char[] BI = {
'比','笔','闭','鼻','碧','必','避','逼','毕','臂','彼','鄙','壁','蓖','币','弊','辟','蔽','毙','庇','敝','陛','毖','痹','秘','泌','秕','薜','荸','芘','萆','匕','裨','畀','俾','嬖','狴','筚','箅','篦','舭','荜','襞','庳','铋','跸','吡','愎','贲','滗','濞','璧','哔','髀','弼','妣','婢','仳','佛','卑','埤','复','媲','幅','庀','拂','捭','服','枇','檗','殍','波','瞥','纰','脾','虑','被','费','跛','鐾','陂','陴','馥'};
函数unsigned char mge_ime char * mgePY_ime_mb实现了在拼音索引表中检索匹配的索引,通过索引检索到相应的汉字数组,unsigned char mge_ime作用是用来将完全匹配的索引都存到cpmgePY_Mb里,并找出完全匹配的组数,char * mgePY_ime_mb函数的作用是如果有匹配的索引组数,则取第一组里的PY_mb,即取输入的数字组合对应的汉字。如果没有匹配的索引组,则返回空字符串。unsigned char mge_ime相应的代码如下及相应的注解如下:
unsigned char mge_ime(char *strInput_mge_str)
{
struct mge_index *cpHZ;//首字母索引
struct mge_index *cpHZedge;//指向了最后一个索引
structmge_index *cpHZTemp;
移动终端汉语拼音输入法及本地搜索接口实现技术(三)由毕业论文网(www.huoyuandh.com)会员上传。