lv_events
LVGL 中任何对象都可以注册事件,相关类型在lv_obj.h
中枚举
enum {
LV_EVENT_PRESSED, /**< The object has been pressed*/
LV_EVENT_PRESSING, /**< The object is being pressed (called continuously while pressing)*/
LV_EVENT_PRESS_LOST, /**< User is still pressing but slid cursor/finger off of the object */
LV_EVENT_SHORT_CLICKED, /**< User pressed object for a short period of time, then released it. Not called if dragged. */
LV_EVENT_LONG_PRESSED, /**< Object has been pressed for at least `LV_INDEV_LONG_PRESS_TIME`. Not called if dragged.*/
LV_EVENT_LONG_PRESSED_REPEAT, /**< Called after `LV_INDEV_LONG_PRESS_TIME` in every
`LV_INDEV_LONG_PRESS_REP_TIME` ms. Not called if dragged.*/
LV_EVENT_CLICKED, /**< Called on release if not dragged (regardless to long press)*/
LV_EVENT_RELEASED, /**< Called in every cases when the object has been released*/
LV_EVENT_DRAG_BEGIN,
LV_EVENT_DRAG_END,
LV_EVENT_DRAG_THROW_BEGIN,
LV_EVENT_GESTURE, /**< The object has been gesture*/
LV_EVENT_KEY,
LV_EVENT_FOCUSED,
LV_EVENT_DEFOCUSED,
LV_EVENT_LEAVE,
LV_EVENT_VALUE_CHANGED, /**< The object's value has changed (i.e. slider moved) */
LV_EVENT_INSERT,
LV_EVENT_REFRESH,
LV_EVENT_APPLY, /**< "Ok", "Apply" or similar specific button has clicked*/
LV_EVENT_CANCEL, /**< "Close", "Cancel" or similar specific button has clicked*/
LV_EVENT_DELETE, /**< Object is being deleted */
_LV_EVENT_LAST /** Number of events*/
};
typedef uint8_t lv_event_t; /**< Type of event being sent to the object. */
#define USER_EVENT_1 (_LV_EVENT_LAST+1) //用户自定义事件 1
static void btn_event_cb(lv_obj_t * obj, lv_event_t event)
{
if (event == LV_EVENT_PRESSED)
{
//对象被按下时触发,每次按下时只触发一次
printf("LV_EVENT_PRESSED\r\n");
}
else if (event == LV_EVENT_PRESSING)
{
//对象正在被按下中,只要按下不放,就会一直被触发
printf("LV_EVENT_PRESSING\r\n");
}
else if (event == LV_EVENT_PRESS_LOST)
{
//在按下的过程中,手指从对象的可视区域划出时被触发
printf("LV_EVENT_PRESS_LOST\r\n");
}
else if (event == LV_EVENT_SHORT_CLICKED)
{
//在 LV_INDEV_LONG_PRESS_TIME 时间之前松手触发,如果是
//在被拖拽的话,则不会被触发
printf("LV_EVENT_SHORT_CLICKED\r\n");
}
else if (event == LV_EVENT_LONG_PRESSED)
{
//按下时长超过 LV_INDEV_LONG_PRESS_TIME 值时触发,
//只会触发一次,如果是在被拖拽的话,则不会被触发
printf("LV_EVENT_LONG_PRESSED\r\n");
}
else if (event == LV_EVENT_LONG_PRESSED_REPEAT)
{
//在触发 LV_EVENT_LONG_PRESSED 事件之后,接
//下来按下的时长每超过 LV_INDEV_LONG_PRESS_REP_TIME 值一次,就会
//被触发一次,如果是在被拖拽的话,则不会被触发
printf("LV_EVENT_LONG_PRESSED_REPEAT\r\n");
}
else if (event == LV_EVENT_CLICKED)
{
//只要松手了就会被触发,但是如果触发了 LV_EVENT_PRESS_LOST
//事件的话,那么此事件将不会被触发
printf("LV_EVENT_CLICKED\r\n");
}
else if (event == LV_EVENT_RELEASED)
{
//和 LV_EVENT_CLICKED 事件一样,没啥区别,位于 LV_EVENT_CLICKED 事
//件之后触发
printf("LV_EVENT_RELEASED\r\n");
}
else if (event == LV_EVENT_DRAG_BEGIN)
{
//拖拽开始时触发
printf("LV_EVENT_DRAG_BEGIN\r\n");
}
else if (event == LV_EVENT_DRAG_END)
{
//拖拽结束时触发
printf("LV_EVENT_DRAG_END\r\n");
}
else if (event == LV_EVENT_DRAG_THROW_BEGIN)
{
//拖拽漂移开始时触发
printf("LV_EVENT_DRAG_THROW_BEGIN\r\n");
}
else if (event == LV_EVENT_REFRESH)
{
//留给用户手动发送触发此事件
uint32_t* data = (uint32_t*)lv_event_get_data();
printf("LV_EVENT_REFRESH data %x\r\n",*data);
}
else if (event == LV_EVENT_DELETE)
{
//对象被删除时触发
printf("LV_EVENT_DELETE\r\n");
}
else if (event == USER_EVENT_1)
{
//用户自定义事件 1
//获取用户自定义数据
uint32_t* data = (uint32_t*)lv_event_get_data();
printf("USER_EVENT_1 data:%x\r\n",*data);
}
}
uint32_t test_data=0x5a;
uint32_t test_data1 = 0x5b;
void lv_events_test()
{
lv_obj_t* scr = lv_scr_act();//获取当前活跃的屏幕对象
//创建一个默认按钮,用来测试事件
lv_obj_t *btn1 = lv_btn_create(scr, NULL);
lv_obj_set_pos(btn1, 20, 20);//设置坐标
lv_obj_set_size(btn1, 150, 50);//设置大小
lv_obj_set_event_cb(btn1, btn_event_cb);//设置回调函数
lv_obj_t* label = lv_label_create(btn1, NULL);//给 btn1 添加 label 子对象
lv_label_set_text(label, "Click me");//设置文本
//下面2个函数手动触发事件
lv_event_send(btn1, USER_EVENT_1, &test_data);//内部调用lv_event_send_func
lv_event_send_func(btn_event_cb, btn1, LV_EVENT_REFRESH, &test_data1);
}