本篇文章将借助一个检测按键的demo程序来介绍如何绑定物理按键并响应,该demo最终效果是按下任意物理按键时会显示该按键key down,松开按键时会显示该按键key up。
图 2 使用AWTK Designer设计界面
navigator_global_widget_on(EVT_KEY_DOWN, on_global_key_down, win);
navigator_global_widget_on(EVT_KEY_UP, on_global_key_up, win);
static ret_t on_global_key_down(void* ctx, event_t* e) { // 按键按下
char ch[50] = {0};
widget_t* win = WIDGET(ctx);
key_event_t* evt = key_event_cast(e);
widget_t* label = widget_lookup(win, "label", TRUE);
const key_type_value_t* ktv = keys_type_find_by_value(evt->key);
if (ktv == NULL || label == NULL || ktv->name == NULL) {
return RET_BAD_PARAMS;
}
/* ktv->name为custom_keys.json绑定键值对应的名称 */
tk_snprintf(ch, sizeof(ch), "%s key down", ktv->name);
widget_set_text_utf8(label, ch);
return RET_OK;
}
static ret_t on_global_key_up(void* ctx, event_t* e) { // 按键抬起
char ch[50] = {0};
widget_t* win = WIDGET(ctx);
key_event_t* evt = key_event_cast(e);
widget_t* label = widget_lookup(win, "label", TRUE);
const key_type_value_t* ktv = keys_type_find_by_value(evt->key);
if (ktv == NULL || label == NULL || ktv->name == NULL) {
return RET_BAD_PARAMS;
}
/* ktv->name为custom_keys.json绑定键值对应的名称 */
tk_snprintf(ch, sizeof(ch), "%s key up", ktv->name);
widget_set_text_utf8(label, ch);
return RET_OK;
}
{
"START" : {
"value" : 290
},
"F1" : {
"value" : 279
}
}
/* awtk-stm32f103ze-raw/awtk-port/main_loop_stm32_raw.c */
void dispatch_input_events(void) {
int key = KEY_Scan(0);
switch (key) {
case KEY_UP: {
key = TK_KEY_UP;
break;
}
case KEY_DOWN: {
key = TK_KEY_DOWN;
break;
}
default: { key = 0; }
}
if (key) {
main_loop_post_key_event(main_loop(), TRUE, key);
} else {
main_loop_post_key_event(main_loop(), FALSE, key);
}
}
更多往期文章,请点击“ 阅读原文 ”。