MTK平台输入法.docx

上传人:桔**** 文档编号:558507488 上传时间:2023-07-27 格式:DOCX 页数:7 大小:22.01KB
返回 下载 相关 举报
MTK平台输入法.docx_第1页
第1页 / 共7页
MTK平台输入法.docx_第2页
第2页 / 共7页
MTK平台输入法.docx_第3页
第3页 / 共7页
MTK平台输入法.docx_第4页
第4页 / 共7页
MTK平台输入法.docx_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《MTK平台输入法.docx》由会员分享,可在线阅读,更多相关《MTK平台输入法.docx(7页珍藏版)》请在金锄头文库上搜索。

1、MTK平台输入法浅析摘要输入法作为手机软件中的一个最基本模块,在人机交互界面的中具有举足轻重的位置。为了帮助大家更快更好的理解输入法在MTK平台上的实现,本文结合mtk的代码从框架性的角度对输入法的实现进行概要导读,希望能够对大家有所收益。一 KeyPad输入Keypad的输入分为两种:一键候选和多键候选。a) 一键候选:指每次按键输入的内容都是确定的,一次按键就是一次输入。比如数字输入,智能拼音输入等。b) 多键候选:指每次按件输入的内容在一定的时间内是不确定的,用户可以通过再次按键来改变当前输入的内容,比如大小写英文,拼音输入法就是这种类型的输入方式。 下面我们将按照上面的划分方式来分别介

2、绍这两种输入方式。 A. 多键候选为了实现多键候选的功能,MTK提供了一个名为multitap的所谓控件,其对应的数据结构为multitap_input。具体内容可以查看代码。以下为一段sample code,用来演示如何利用multitap控件来实现某一种multitap类型输入(比如大小写的ABC):for(i = 0; i MAX_MULTITAPS; i+)s = (UI_string_type) numberless_lowercase_multitap_stringsi;pixtel_UI_create_multitap_input(&g_pen_editor_bpmf_pinyi

3、n_active_multitapi,MMI_multitap_x,MMI_multitap_y,width,MMI_multitap_height,s); -为每一个输入键(键0-9)建立一个multitap控件赋一些初值(比如键2的循环数组为“ABC2”);register_MMI_key_input_handler();-把所有字符输入(键0-9)的keyhandler都影射到同一个函数MMI_key_input_handler上此函数的实质就是调用接下来要设置的keyup和key down的handler函数register_key_up_handler(mmi_pen_editor_

4、bpmf_pinyin_key_up_handler);-注册所有键的keyup handler,该handler会调用multitap控件的input_complete_callback函数,来结束一次multitap的输入register_key_down_handler(mmi_pen_editor_bpmf_pinyin_key_down_handler);-注册所有键的keydown handler,该handler会在某个键的候选项里进行循环,同时也会调用multitap控件的input_callback函数for(i = 0; i MAX_MULTITAPS; i+)pixtel

5、_UI_set_multitap_input_callbacks(&g_pen_editor_bpmf_pinyin_active_multitapi,mmi_pen_editor_bpmf_pinyin_multitap_input,mmi_pen_editor_bpmf_pinyin_multitap_input_complete); -设置multitap的上述两个回调函数在完成了以上代码以后,一般来说我们就可以进行多键候选的输入了1) 输入一个键(比如2键),此时Keydown handler会根据键值找到其对应得multitap,此时输入内容为“ABC2”中的第一个字母“A”,并保存

6、当前输入在此数组中的位置,同时更新inputbox的视图,置一个active_multitap为当前按键,并在该键keyuphandler里启动一个定时器2) 如果用户在定时器超时之前,再次按下一个键,则keydow handler会判断是否跟上一次的activemultitap一样,如果一样则在上次的位置上循环加1,比如上次是A,这次就是B了;如果这次按键和上次不一样,则表示开始一个新的按键了,则首先调用input_complete_callback来处理上一个按键应该完成的事宜(比如更新inputbox的视图)。同时回到状态1进行新的输入处理3) 如果用户在定时器超时之前,都没有按键,则直

7、接调用input_complete-calllback来处理。完成一次multitap的输入B. 一键候选相对多键候选来说,一键候选的实现要简单得多,同样下面我们也使用代码来看看一键候选的实现clear_multitap_key_handlers();-清除以前设置的mutitap keyhandlerregister_MMI_key_input_handler();-把所有字符输入(键0-9)的keyhandler都影射到同一个函数MMI_key_input_handler上此函数的实质就是调用接下来要设置的key down的handler函数register_key_down_handle

8、r(EMS_inputbox_handle_key_down);-注册所有键的keydown handler其实跟上面的多键候选相比,基本上一键候选是非常简单的每次按键都会调用到keydown handler 在inputbox里面输入唯一的一个输入值。所以keydown handler只需要处理如何更新inputbox的视图即可二 Touch输入对于触摸屏来说,通常有两种模式:一种是触摸模式,另一种是手写模式。由于触摸屏的这个特性,MTK也为我们的输入提供了两种相应的模式:手写输入和虚拟键盘输入。A. 手写输入mmi_pen_start_capture_strokes(PEN_EDITOR_

9、STROKE_BUFFER_SIZE, gPenEditorStrokeBuffer, 1, stroke_area, ext_stroke);-设置手写区域和手写数据缓冲大小 mmi_pen_register_stroke_down_handler(mmi_pen_editor_stroke_down_handler);mmi_pen_register_stroke_move_handler(NULL, NULL, mmi_pen_editor_stroke_move_handler);mmi_pen_register_stroke_up_handler(mmi_pen_editor_str

10、oke_up_handler);-注册触摸笔手写模式下down,move和up三种状态的回调函数在进行了以上的操作以后,每次当用户在手写区滑动触笔时,相应的回调会被调用。1 触笔点下:将开始点的坐标数据放入缓冲区,进入手写状态,更新相关的全局变量,并开始设置新的layer用于绘制当前手写轨迹。2 触笔移动: 将移动中的每个坐标掉放入设置好的数据缓冲区内,直至缓冲区满。目前MTK提供的代码里,一次手写最大支持500个点的数据。3 触笔抬起:启动一个定时器。4 如果直到定时器超时,触笔的状态还是UP状态,则意味着一次手写的完成;此时reset掉在状态1中设置的新的layer层,并将所有的手写数据传

11、递给手写识别软件来获得此次手写的候选字项。5 如果定时器超时的时刻,触笔的状态是DOWN的状态,则意味着用户又开始进行新的笔划输入了,本次手写还没有完成。状态继续回到1或者2。B. 虚拟键盘输入虚拟键盘的输入较为简单,同所有其他的控件一样,虚拟键盘也是一个的控件。对该控件的触摸输入只需要注册其对应的处理函数即可。 mmi_pen_register_abort_handler(mmi_pen_editor_pen_abort_handler); mmi_pen_register_down_handler(mmi_pen_editor_pen_down_handler); mmi_pen_regi

12、ster_long_tap_handler(mmi_pen_editor_pen_long_tap_handler); mmi_pen_register_move_handler(mmi_pen_editor_pen_move_handler); mmi_pen_register_up_handler(mmi_pen_editor_pen_up_handler); mmi_pen_register_repeat_handler(mmi_pen_editor_pen_repeat_handler);在所有使用到虚拟键盘输入的地方,我们都需要调用以上的一些代码片断来设置我们的触摸控制回调函数。1)

13、 触笔点下虚拟键盘上的某一个键,会触发mmi_pen_editor_pen_down_handler,这个函数会对触摸的区域进行判断,确定是点在某个有效的按键上还是虚拟键盘以外2) 如果是合法的按键部分,在mmi_pen_editor_pen_up_handler会对其作相应的处理。比如说,在汉字拼音输入法时输入一个字母h,那么mmi_pen_editor_pen_up_handler里会调用mmi_ime_get_candidates_by_composition来取得该输入的候选字,并且把该候选字显示在虚拟键盘的候选区域内三 输入法引擎在上面两个章节的描述时,我们基本上只关注了如何实现输入

14、,但是没有牵涉到输入法引擎的使用。实际中MTK只提供了英文和数字的输入,对于汉字拼音和笔画之类的输入只能采用第三方的输入法引擎来完成。对于采用了第三方引擎的输入法实现来说,与上面介绍的不同之处就是:我们必须在key handler里面通过调用引擎的APPI来获取相关的候选字。下面我们以T9输入引擎为例来看看,如果集成一个输入法引擎来实现输入。T9ChangeLanguageForEMSInputBox(mode);-根据mode来初始化引擎T9ClearKeyStarAndPoundHandler(); T9ClearKeyNavigationHandler(); T9ClearKey0To9

15、Handler();-清除原有keyhandler SetKeyHandler(handle_category28_change_input_mode,KEY_POUND,KEY_EVENT_DOWN); SetKeyHandler(T9KeyStarPressHandlerForEMSInputBox,KEY_STAR,KEY_EVENT_DOWN); SetKeyHandler(T9KeyArrowUPHandlerForEMSInputBox, KEY_UP_ARROW, KEY_EVENT_DOWN); SetKeyHandler(T9KeyArrowRightHandlerForEMSInputBox,KEY_RIGHT_ARROW,KEY_EVENT_DOWN); SetKeyHandler(T9KeyArrowDownHandlerForEMSInputBox, KEY_DOW

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号