LVGL在大量创建事件的时候如果给每一个事件都重新写一个服务函数实在是过于麻烦。所以可以通过使用函数lv_obj_add_event_cb自带的void *user_data传递参数。这样就可以使用一个服务函数且不会互相干扰。
struct _lv_event_dsc_t * lv_obj_add_event_cb(struct _lv_obj_t * obj
, lv_event_cb_t event_cb
, lv_event_code_t filter,
void * user_data); //指这里的user_data 在别的函数也类似
1.方法是先初始化一个静态的变量存储数据
2.然后将其地址赋给一个中间变量 void *temp
3.最后在服务函数中将这个地址的数据恢复
void my_btn_event(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_CLICKED)
{
int *num=e->user_data; //通过此把要传递的数据重新恢复
LV_LOG_USER("\n BTN: %d",*num+1);
}
}
void btn_menu(void)
{
int i=3;
static int num[8]={0,1,2,3,4,5,6,7};
static lv_obj_t * my_btn[8];
for(i=0;i<8;i++){
my_btn[i] = lv_btn_create(lv_scr_act());
lv_obj_set_size(my_btn[i],50,50);
lv_obj_align(my_btn[i],LV_ALIGN_DEFAULT,0,i*100);
void *temp=&num[i]; //通过此转换传递地址
lv_obj_add_event_cb(my_btn[i], my_btn_event, LV_EVENT_ALL, temp);
}
}
最后效果下图