按键

1. 简介

提供标准化的按键事件处理框架,简化硬件按键与UI逻辑的对接流程,支持多类型按键事件与优先级调度,适配智能设备的交互需求。

  • 系统内置了两个按键位:LVSF_KEY_TYPE_HOME 和 LVSF_KEY_TYPE_ESC。需要用户自行去对接硬件相关引脚。

  • 系统支持按下、抬起、短按、连按、10秒以内长按的事件响应。页面创建的时候注册对应的按键事件,销毁页面的时候注销按键事件。当按键触发时,框架会优先运行高优先级的注册函数,如果函数中不返回未处理的结果,那么低优先级的注册函数也会收到该事件。

2. 按键事件注册

通过LV_KEY_REGESTER宏完成按键事件注册,关联按键类型、处理优先级与回调函数。

2.1 注册宏定义

通过此宏定义进行按键事件注册的时候,会将调用接口的文件名同时保存,以避免相同文件进行重复注册。一个页面只能给每个按键注册一个处理函数。

#define LV_KEY_REGESTER(key, prio, handle) \
    (lv_key_manager_regester(key, prio, handle, strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__))

宏参数说明

参数名

类型

功能描述

key

lv_key_manager_type_t

目标按键键值,如LVSF_KEY_TYPE_HOME(主页键)、LVSF_KEY_TYPE_ESC(退出键)

prio

整数

处理优先级,数值越大优先级越高(如 20 优先级高于 15)

handle

函数指针

按键事件回调函数,按键触发时执行具体逻辑

2.2 按键事件注册

int32_t key_goback_cb(lv_key_manager_type_t key, keypad_key_state_t event)
{
    /*如果按键为HOME,并且事件为短按,处理该事件*/
    if (LVSF_KEY_TYPE_HOME == key && KEYPAD_KEY_STATE_SHORT_CLICK == event)
    {
    /*返回上一页*/
        gui_app_goback();
    /*返回TREAT, 后续低优先级的处理函数不会再接收到此短按事件*/
        return LV_KEY_EVENT_TREAT;
    }

    /*返回UNTREAT, 后续低优先级的处理函数会再接收到此短按事件,再去执行相应处理*/
    return LV_KEY_EVENT_UNTREAT;
}

int32_t key_poweroff_cb(lv_key_manager_type_t key, keypad_key_state_t event)
{
    /*如果按键为ESC,并且事件为长按,处理该事件长按8.5秒*/
    if (LVSF_KEY_TYPE_HOME == key && KEYPAD_KEY_STATE_LONG_PRESS_8S | KEYPAD_KEY_STATE_LONG_PRESS_05S == event)
    {
    /*关机*/
        app_power_off_action(POWER_OFF);
    /*返回TREAT, 后续低优先级的处理函数不会再接收到此长按事件*/
        return LV_KEY_EVENT_TREAT;
    }

    /*返回UNTREAT, 后续低优先级的处理函数会再接收到此长按事件,再去执行相应处理*/
    return LV_KEY_EVENT_UNTREAT;
}

static void on_start(void)
{
    /*给当前页面的HOME键注册一个优先级为15的按键事件,用于按键放回上一页*/
    LV_KEY_REGESTER(LVSF_KEY_TYPE_HOME, 15, key_goback_cb);

    /*给当前页面的ESC键注册一个优先级为20的按键事件, 用于长按关机*/
    LV_KEY_REGESTER(LVSF_KEY_TYPE_ESC, 15, key_poweroff_cb);
}

2.3.按键事件注销

通过LV_KEY_UNREGESTER宏注销按键事件,释放关联资源,避免页面销毁后仍响应按键。

#define LV_KEY_UNREGESTER(key) \
    (lv_key_manager_unregester(key, strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__))\

宏参数说明

参数名

类型

功能描述

key

lv_key_manager_type_t

需注销事件的按键键值,需与注册时使用的键值保持一致,确保精准释放对应事件回调

/**
 * 页面销毁时注销按键事件
 */
static void on_stop(void)
{
    /*将当前页面的HOME键的事件注销*/
    LV_KEY_UNREGESTER(LVSF_KEY_TYPE_HOME);

    /*将当前页面的ESC键的事件注销*/
    LV_KEY_UNREGESTER(LVSF_KEY_TYPE_ESC);
}