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

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
lvgl checkbox 实现互斥,可以通过给所有的 checkbox 绑定同一个回调函数,在回调函数中,对所有的 checkbox 进行遍历,判断哪些 checkbox 被选中,如果有多个被选中,则取消除最后选择的那一个以外的所有选择。同时,也可以在回调函数中对被选中的 checkbox 进行一些后续操作。下面是一个示例代码: ```c /* 回调函数 */ static void checkbox_group_cb(lv_obj_t *checkbox, lv_event_t event) { if(event == LV_EVENT_VALUE_CHANGED) { lv_obj_t *checkbox_group = lv_obj_get_parent(lv_obj_get_parent(checkbox)); /* 遍历所有 checkbox 并取消大部分的选中 */ lv_obj_t *child; LV_LL_READ(lv_obj_get_child_ll(checkbox_group), child) { if(lv_obj_is_checkbox(child)) { if(child != checkbox && lv_checkbox_is_checked(child)) { lv_checkbox_set_checked(child, false); } } } /* 后续操作 */ if(lv_checkbox_is_checked(checkbox)) { printf("Checkbox %s is checked\n", lv_checkbox_get_text(checkbox)); } else { printf("Checkbox %s is unchecked\n", lv_checkbox_get_text(checkbox)); } } } /* 创建 checkbox */ lv_obj_t *checkbox_group = lv_cont_create(lv_scr_act(), NULL); lv_cont_set_fit2(checkbox_group, LV_FIT_PARENT, LV_FIT_TIGHT); lv_cont_set_style(checkbox_group, LV_CONT_STYLE_MAIN, &lv_style_transp); lv_obj_t *checkbox1 = lv_checkbox_create(checkbox_group, NULL); lv_checkbox_set_text(checkbox1, "Checkbox 1"); lv_obj_set_event_cb(checkbox1, checkbox_group_cb); lv_obj_t *checkbox2 = lv_checkbox_create(checkbox_group, checkbox1); lv_checkbox_set_text(checkbox2, "Checkbox 2"); lv_obj_set_event_cb(checkbox2, checkbox_group_cb); lv_obj_t *checkbox3 = lv_checkbox_create(checkbox_group, checkbox2); lv_checkbox_set_text(checkbox3, "Checkbox 3"); lv_obj_set_event_cb(checkbox3, checkbox_group_cb); ``` 这样,就可以实现多个 checkbox 之间的互斥了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值