LVGL V8应用——实现互斥

按键互斥

void language_setup()
{
    
    
    lv_obj_t * cont = lv_obj_create(page);
    lv_obj_set_size(cont, 320,160);

    lv_obj_t * ch_cb = lv_checkbox_create(cont);
    lv_obj_set_size(ch_cb , 100,40);
    lv_obj_set_pos(ch_cb ,10,10);

    lv_checkbox_set_text(ch_cb, "中文");
    lv_obj_add_flag(ch_cb, LV_OBJ_FLAG_EVENT_BUBBLE);

    lv_obj_t * en_cb = lv_checkbox_create(cont);
    lv_obj_set_size(en_cb , 100,40);
    lv_obj_set_pos(en_cb ,10,60);

    lv_checkbox_set_text(en_cb, "English");
    lv_obj_add_flag(en_cb, LV_OBJ_FLAG_EVENT_BUBBLE);

    lv_obj_add_event_cb(cont, language_event_handler, LV_EVENT_CLICKED, &language);

     /*Make the first checkbox checked*/
    lv_obj_add_state(lv_obj_get_child(cont, language), LV_STATE_CHECKED);
}

复选框互斥

应用:实现中英文切换
设置language问全局变量,language=0表示中文,language=1表示英语

void init_page(lv_obj_t * page)
{
    
    
    lv_obj_t * cont = lv_obj_create(page);
    lv_obj_set_size(cont, 320,160);

    lv_obj_t * ch_cb = lv_checkbox_create(cont);
    lv_obj_set_size(ch_cb , 100,40);
    lv_obj_set_pos(ch_cb ,10,10);

    lv_checkbox_set_text(ch_cb, "中文");
    lv_obj_add_flag(ch_cb, LV_OBJ_FLAG_EVENT_BUBBLE);

    lv_obj_t * en_cb = lv_checkbox_create(cont);
    lv_obj_set_size(en_cb , 100,40);
    lv_obj_set_pos(en_cb ,10,60);

    lv_checkbox_set_text(en_cb, "English");
    lv_obj_add_flag(en_cb, LV_OBJ_FLAG_EVENT_BUBBLE);
	//注册回调函数的时候将language作为用户参数传入
    lv_obj_add_event_cb(cont, language_event_handler, LV_EVENT_CLICKED, &language);

     /*根据语言获取其中一个复选框,中文为0选中第1个,英语为1选中第2个,然后设置该复选框为选中*/
    lv_obj_add_state(lv_obj_get_child(cont, language), LV_STATE_CHECKED);
}

启用了 lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE),所有事件也将发送到对象的父级(如果父级也启用了LV_OBJ_FLAG_EVENT_BUBBLE,则事件也将发送到其父级,依此类推)。所以这里可以直接对cont注册事件,因为ch_cb、en_cb都会将事件传递到其父级,触发回调函数。

lv_obj_add_event_cb(cont, language_event_handler, LV_EVENT_CLICKED, &language);

触发回调函数之后:

  • 获取用户数据active_id(language地址),
  • 获取当前目标对象cont(因为事件冒泡的原因都会是复选框checkbox的父对象cont),
  • 获取最初聚焦的目标对象act_cb (有3种可能:父对象cont,子对象ch_cb ,子对象en_cb ),如果act_cb == cont,表明点击的对象是复选框checkbox周围的容器cont,直接退出不处理。
  • 根据*active_id获取父对象cont的子对象old_cb (首先创建了中文子对象ch_cb,然后创建了英文子对象 en_cb,所以通过lv_obj_get_child(cont,0)获取的是ch_cb,lv_obj_get_child(cont,1)获取的是en_cb)
  • 清除前一个子对象的点击状态,给新的子对象添加点击状态
  • 获取新的子对象索引,修改*active_id
static void language_event_handler(lv_event_t * e)
{
    
    
	//获取用户数据
    u16 * active_id = lv_event_get_user_data(e);
    lv_obj_t * cont = lv_event_get_current_target(e);
    lv_obj_t * act_cb = lv_event_get_target(e);
    lv_obj_t * old_cb = lv_obj_get_child(cont, *active_id);

    /*Do nothing if the container was clicked*/
    if(act_cb == cont) return;

    lv_obj_clear_state(old_cb, LV_STATE_CHECKED);   /*Uncheck the previous radio button*/
    lv_obj_add_state(act_cb, LV_STATE_CHECKED);     /*Uncheck the current radio button*/

    *active_id = lv_obj_get_index(act_cb);
    LV_LOG_USER("Selected radio buttons: %d", (u16)*active_id);
}

Message box实现互斥

请添加图片描述

static void language_setup(lv_ui *ui)
{
    
    
    static const char * btns[] ={
    
    "中文", "English", ""};

    ui-> mbox1 = lv_msgbox_create(NULL, "Hello", "This is a message box with two buttons.", btns, true);

    lv_obj_center(ui-> mbox1);
    //lv_msgbox_get_active_btn(ui-> mbox1);
    lv_obj_t *btnm = lv_msgbox_get_btns(ui-> mbox1);     //从Message box获取btnm子对象
    lv_obj_add_style(btnm, &style, 0);

    lv_btnmatrix_set_btn_ctrl(btnm, language, LV_BTNMATRIX_CTRL_CHECKED); //根据language设置选中按钮
    lv_obj_add_event_cb(btnm, event_cb, LV_EVENT_VALUE_CHANGED, ui);   //注册LV_EVENT_VALUE_CHANGED时间回调函数
}
static void event_cb(lv_event_t * e)
{
    
    
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * obj = lv_event_get_target(e);           //获取事件对象obj
    uint16_t id = lv_btnmatrix_get_selected_btn(obj);  //获取最后一个“激活”矩阵按钮的索引
    lv_ui * user_data = lv_event_get_user_data(e);

    if(code == LV_EVENT_VALUE_CHANGED)
    {
    
    
        if(language==1 && id==0)
        {
    
    
            language = 0;
            lv_btnmatrix_clear_btn_ctrl(obj, 1, LV_BTNMATRIX_CTRL_CHECKED);
            lv_btnmatrix_set_btn_ctrl(obj, 0, LV_BTNMATRIX_CTRL_CHECKED);
        }
        else if(language==0 && id==1)
        {
    
    
            language = 1;
            lv_btnmatrix_clear_btn_ctrl(obj, 0, LV_BTNMATRIX_CTRL_CHECKED);
            lv_btnmatrix_set_btn_ctrl(obj, 1, LV_BTNMATRIX_CTRL_CHECKED);
        }
        set_ccd_data(LANGUAGE,language);
        LV_LOG_USER("%d \n", language);
   	   	lv_label_set_text(user_data->screen_setup_label_t, SetMenuName[language]);
     	lv_label_set_text(user_data->screen_setup_btn_bck_label, BackName[language]);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37187962/article/details/125662955