按键

一、简介

系统内置了两个按键位:LVSF_KEY_TYPE_HOME 和 LVSF_KEY_TYPE_ESC。需要用户自行去对接硬件相关引脚。
系统支持按下、抬起、短按、连按、10秒以内长按的事件响应。页面创建的时候注册对应的按键事件,销毁页面的时候注销按键事件。当按键触发时,框架会优先运行高优先级的注册函数,如果函数中不返回未处理的结果,那么低优先级的注册函数也会收到该事件。\

二、按键事件注册

#define LV_KEY_REGESTER(key, prio, handle) (lv_key_manager_regester(key, prio,handle, strrchr(FILE, ‘\’) ? strrchr(FILE, ‘\’) + 1 : FILE))\

key: 按键键值
prio: 按键处理的优先级,值越大,优先级越高
handle: 按键处理回调函数\

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


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);
}

三、按键事件注销

#define LV_KEY_UNREGESTER(key) (lv_key_manager_unregester(key, strrchr(FILE, ‘\’) ? strrchr(FILE, ‘\’) + 1 : FILE))\

key: 按键键值\

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

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