LVGL实现按钮互斥效果

35 篇文章 15 订阅
22 篇文章 1 订阅

效果

在这里插入图片描述

实现代码

在你的代码中调用 lv_100ask_example_btn 函数:


 static void btn_event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * another_btn = (lv_obj_t *)lv_event_get_user_data(e);
    lv_obj_t * btn = lv_event_get_target(e);
    lv_obj_t * label = lv_obj_get_child(btn, 0);
    char * label_text = lv_label_get_text(label);

    if(code == LV_EVENT_CLICKED) {
        if((strcmp(label_text, "START") == 0)&&\
           (lv_obj_has_state(another_btn, LV_STATE_DISABLED))) {
            lv_obj_add_state(btn, LV_STATE_DISABLED);
            lv_obj_clear_state(another_btn, LV_STATE_DISABLED);
        }
        else if((strcmp(label_text, "STOP") == 0) &&\
                (lv_obj_has_state(another_btn, LV_STATE_DISABLED))) {
            lv_obj_clear_state(another_btn, LV_STATE_DISABLED);
            lv_obj_add_state(btn, LV_STATE_DISABLED);
        }
    }
}


static void lv_100ask_example_btn(void)
{
    lv_obj_t * label;

    lv_obj_t * btn1 = lv_btn_create(lv_scr_act());
    lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);

    label = lv_label_create(btn1);
    lv_label_set_text(label, "START");
    lv_obj_center(label);

    lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
    lv_obj_add_state(btn2, LV_STATE_DISABLED);
    lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);

    label = lv_label_create(btn2);
    lv_label_set_text(label, "STOP");
    lv_obj_center(label);

    lv_obj_add_event_cb(btn1, btn_event_handler, LV_EVENT_ALL, btn2);
    lv_obj_add_event_cb(btn2, btn_event_handler, LV_EVENT_ALL, btn1);
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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 之间的互斥了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挨踢民工biubiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值