到这,key event 的处理基本上就算完成了。其他几个常用的函数注册key 处理函数了。了解了按键event的处理过程之后(其实也是比较简单的),注册函数就很好了解了,就是把相应key 和 event 的数组里放入一个回调函数的指针。比如
void SetKeyHandler(FuncPtr funcPtr, U16 keyCode, U16 keyType) 抛开其他语句,就是一句简单的实现currKeyFuncPtrs[keyCode][keyType] = funcPtr; 还有可以设置一组按键的处理函数,
void SetGroupKeyHandler(FuncPtr funcPtr, PU16 keyCodes, U8 len, U16 keyType),这个很好理解,keyCodes 就是一个按键数组,len是这个数组的长度。实现也很简单,就是一个for循环,把这些keyCodes的回调函数都写成 funcPtr。这里就不再说了(其实也没有什么可以说得了)
其他还有:
void mmi_frm_kbd_reg_pre_key_hdlr(PsKeyProcessCBPtr func) ; //注册按键预处理函数,MTK MMI event 小结 6 解释过
void mmi_frm_kbd_set_tone_state(mmi_frm_kbd_tone_state_enum state); // 设置按键音。需要说明一点,在开发一个应用程序的时候,有些手机状态一般先保存一下进入程序前的状态,在自己的app 退出后还原状态。比如这个按键音,背光长亮等等
接下来简单说一下触摸屏事件,其实触摸屏的实现跟key event 几乎一样。也是通过pen event 缓存队列来获得pen 事件。来看几个代码.
先看一下初始化函数:mmi_pen_init
void mmi_pen_init(void) { g_pen_initialized = KAL_TRUE; // 看到这两个函数指针,是不是感觉很熟悉?对,就是跟key 一样,前置处理和后置处理函数 // 这个看多了,不用细看代码就能猜到了。 g_pen_cntx.pre_pen_callback_fp = NULL; g_pen_cntx.post_pen_callback_fp = NULL; // 设置 手写输入法的区域,手写输入法在 触摸屏这里需要特殊处理。 mmi_pen_stop_capture_strokes(); // 设置触摸屏采样时间间隔,参数一是在普通状态下,采样时间间隔,参数二是手写输入法情况下采样时间间隔 mmi_pen_config_sampling_period(MMI_PEN_SAMPLING_PERIOD_1, MMI_PEN_SAMPLING_PERIOD_2); // 设置超时时间间隔 mmi_pen_config_timeout_period(MMI_PEN_LONGTAP_TIME, MMI_PEN_REPEAT_TIME, MMI_PEN_STROKE_LONGTAP_TIME); // 设置move 的间距,也就是两个点之间多少个pixel 算move 事件。 mmi_pen_config_move_offset( MMI_PEN_SKIP_MOVE_OFFSET, MMI_PEN_SKIP_STROKE_MOVE_OFFSET, MMI_PEN_SKIP_LONGTAP_OFFSET, MMI_PEN_SKIP_STROKE_LONGTAP_OFFSET); // 设置drv 的回调函数,也就是当产生事件时,会回调这个函数 touch_panel_cb_registration(mmi_pen_touch_panel_sendilm, NULL); // 设置MMI 层消息 MSG_ID_TP_EVENT_IND 的处理函数 SetProtocolEventHandler(mmi_pen_touch_panel_event_ind, MSG_ID_TP_EVENT_IND); }
在驱动drv 这一层,触摸屏有一个task-- MOD_TP_TASK,在处理 事件,MOD_TP_TASK 会回调用 touch_panel_cb_registration 注册的函数,有pen event 事件产生了,这个去pen event 缓存里去,这里注册的是:mmi_pen_touch_panel_sendilm 函数,这个函数就是简单的向MMI task 发送一个消息 MSG_ID_TP_EVENT_IND,让MMI task 来处理。这里这么做的原因也很简单,drv 的task 优先级是很高的,要处理的东西也很多,所以希望回调函数能很快处理完这个事情(发送一个消息很快),这里可以想一下 pc 上的中断,这两者差不多。当然中断还有更多其他原因,比如内核态和用户态等等,需要回调函数尽可能快处理,发送消息到消息队列(扯远了。。。)。
还有一点需要说明的是,现在触摸屏的手机越来越普遍,那么该善触摸屏的体验是非常重要的,可惜的是MTK 的又不是多点触摸,处理起来很费劲。这个时候就需要充分利用好这里的几个设置,采样时间间隔,以及move 事件距离。需要时,让自己app可以捕获尽可能多的点,然后自己进行计算,来判断用户行为。这对改善体验很有帮助。当然这个也是比较耗电的,不需要时,一定要设置回普通状态。
转自:http://blog.csdn.net/yanwuxufeng/archive/2010/08/09/5800121.aspx