碛物 发表于 2025-6-13 15:35:37

LVGL-复选框

lv_checkbox_create函数

此函数用于创建一个复选框的对象
lv_obj_t *lv_checkbox_create(lv_obj_t *parent)
//parent:父对象的指针
//ret:返回创建的复选框的句柄lv_checkbox_set_text函数

设置复选框的内容,如果复选框之前已经设置了文本,该函数会覆盖原来的文本。
void lv_checkbox_set_text(lv_obj_t *obj, const char *txt)
//obj:复选框的的句柄
//txt:要写入的内容lv_checkbox_set_text_static函数

用于为复选框设置静态文本的函数
void lv_checkbox_set_text_static(lv_obj_t * obj, const char * txt);
//obj:指向复选框对象的指针
//txt:要设置的静态文本内容。该文本的生命周期必须与复选框一致,即在复选框销毁之前,txt 指向的内存不能被释放lv_checkbox_get_text函数

获取复选框当前文本内容的函数
const char * lv_checkbox_get_text(lv_obj_t * obj);
//obj:指向复选框对象的指针
//ret:返回一个指向复选框当前文本内容的指针lv_event_get_code函数

用于获取事件代码的函数
lv_event_code_t lv_event_get_code(lv_event_t * e);
//e:指向 lv_event_t 类型的事件描述符,该描述符包含了事件的所有信息
//ret:返回事件代码,例如 LV_EVENT_CLICKED、LV_EVENT_FOCUSEDlv_event_get_target函数

用于获取事件目标对象的函数。它可以从事件描述符中提取触发事件的对象
lv_obj_t * lv_event_get_target(lv_event_t * e);
//e:指向 lv_event_t 类型的事件描述符,该描述符包含了事件的所有信息。
//ret:返回触发事件的对象指针(lv_obj_t *),即事件的目标对象lv_obj_get_state函数

用于获取对象当前状态的函数。它返回一个状态码,表示对象的当前状态,例如是否被选中、是否被禁用等
lv_state_t lv_obj_get_state(const lv_obj_t * obj);
//obj:指向复选框对象的指针
//ret:返回一个 lv_state_t 类型的状态码,表示对象的当前状态
/*
LV_STATE_DEFAULT:默认状态。
LV_STATE_FOCUSED:对象获得焦点。
LV_STATE_FOCUSED_KEY:对象通过键盘获得焦点。
LV_STATE_PRESSED:对象被按下。
LV_STATE_CHECKED:对象被选中(例如复选框)。
LV_STATE_DISABLED:对象被禁用。
LV_STATE_HOVERED:对象被鼠标悬停。
LV_STATE_FOCUSED_PRESSED:对象获得焦点且被按下。
LV_STATE_FOCUSED_HOVERED:对象获得焦点且被鼠标悬停。
*/lv_obj_set_flex_flow函数

用于设置容器的 Flexbox 布局方向和换行行为的函数
void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow);
//obj:指向复选框对象的指针
//flow:Flexbox 的排列方向和换行行为,类型为 lv_flex_flow_t 枚举值
/*
LV_FLEX_FLOW_ROW:子对象按行排列,不换行。
LV_FLEX_FLOW_ROW_WRAP:子对象按行排列,超出容器宽度时换行。
LV_FLEX_FLOW_COLUMN:子对象按列排列,不换行。
LV_FLEX_FLOW_COLUMN_WRAP:子对象按列排列,超出容器高度时换行
*/lv_obj_set_flex_align函数

用于设置容器(Container)的 Flexbox 布局对齐方式的函数。它允许开发者控制子对象在主轴(main axis)和交叉轴(cross axis)上的对齐方式
void lv_obj_set_flex_align(lv_obj_t * obj, lv_flex_align_t main_place, lv_flex_align_t cross_place, lv_flex_align_t track_place);
//obj:指向目标容器对象的指针
//main_place:主轴上的对齐方式,类型为 lv_flex_align_t 枚举值
/*
LV_FLEX_ALIGN_START:子对象对齐到主轴的起始位置。
LV_FLEX_ALIGN_CENTER:子对象在主轴上居中对齐。
LV_FLEX_ALIGN_END:子对象对齐到主轴的结束位置。
LV_FLEX_ALIGN_SPACE_BETWEEN:子对象在主轴上均匀分布,两端对齐。
LV_FLEX_ALIGN_SPACE_AROUND:子对象在主轴上均匀分布,两端留有间隔。
LV_FLEX_ALIGN_SPACE_EVENLY:子对象在主轴上均匀分布,包括两端。
*/
//cross_place:交叉轴上的对齐方式,类型为 lv_flex_align_t 枚举值
/*
LV_FLEX_ALIGN_START:子对象对齐到交叉轴的起始位置。
LV_FLEX_ALIGN_CENTER:子对象在交叉轴上居中对齐。
LV_FLEX_ALIGN_END:子对象对齐到交叉轴的结束位置。
LV_FLEX_ALIGN_BASELINE:子对象对齐到基线(仅适用于文本对象)
*/
//track_place:多行或多列布局时,行或列之间的对齐方式,类型为 lv_flex_align_t 枚举值
/*
LV_FLEX_ALIGN_START:行或列对齐到起始位置。
LV_FLEX_ALIGN_CENTER:行或列居中对齐。
LV_FLEX_ALIGN_END:行或列对齐到结束位置。
LV_FLEX_ALIGN_SPACE_BETWEEN:行或列在交叉轴上均匀分布,两端对齐。
LV_FLEX_ALIGN_SPACE_AROUND:行或列在交叉轴上均匀分布,两端留有间隔。
LV_FLEX_ALIGN_SPACE_EVENLY:行或列在交叉轴上均匀分布,包括两端
*/lv_obj_get_child函数

用于获取容器中子对象的函数
lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, uint32_t idx);
//obj:指向目标容器对象的指针
//idx:子对象的索引,从 0 开始//example
static void event_handler(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);//获取事件代码
    lv_obj_t * obj = lv_event_get_target(e);//获取事件目标对象
    if(code == LV_EVENT_VALUE_CHANGED) {//对象的值是否发生变化
      const char * txt = lv_checkbox_get_text(obj);//获取复选框的内容
      const char * state = lv_obj_get_state(obj) & LV_STATE_CHECKED ? "Checked" : "Unchecked";//判断对象当前状态
      LV_LOG_USER("%s: %s", txt, state);//插入日志信息
    }
}

void lv_example_checkbox_1(void)
{
    lv_obj_set_flex_flow(lv_scr_act(), LV_FLEX_FLOW_COLUMN);//设置对象为按列排列,不换行
    lv_obj_set_flex_align(lv_scr_act(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);//设置对象为主轴居中对齐,对齐到交叉点的起始位置,多行布局时行列对齐

    lv_obj_t * cb;
    cb = lv_checkbox_create(lv_scr_act());//创建一个复选框对象
    lv_checkbox_set_text(cb, "Apple");//添加文本内容
    lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);//为对象添加回调函数

    cb = lv_checkbox_create(lv_scr_act());
    lv_checkbox_set_text(cb, "Banana");
    lv_obj_add_state(cb, LV_STATE_CHECKED);//为对象添加状态,为对象被选中
    lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);

    cb = lv_checkbox_create(lv_scr_act());
    lv_checkbox_set_text(cb, "Lemon");
    lv_obj_add_state(cb, LV_STATE_DISABLED);//为对象添加状态,为对象被禁用
    lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);

    cb = lv_checkbox_create(lv_scr_act());
    lv_obj_add_state(cb, LV_STATE_CHECKED | LV_STATE_DISABLED);//为对象添加状态,为对象被选中和被禁用
    lv_checkbox_set_text(cb, "Melon\nand a new line");
    lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);

    lv_obj_update_layout(cb);//更新对象布局
}
}// 定义全局样式变量,用于设置单选按钮的样式
static lv_style_t style_radio;
static lv_style_t style_radio_chk;

// 定义全局变量,用于存储当前选中的单选按钮的索引
static uint32_t active_index_1 = 0;
static uint32_t active_index_2 = 0;

// 单选按钮的事件回调函数
static void radio_event_handler(lv_event_t * e)
{
    // 从事件描述符中获取用户自定义数据(当前选中的单选按钮索引)
    uint32_t * 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);

    /* 如果点击的是容器本身,则不做任何处理 */
    if(act_cb == cont) return;

    // 取消旧单选按钮的选中状态
    lv_obj_clear_state(old_cb, LV_STATE_CHECKED);

    // 设置新单选按钮的选中状态
    lv_obj_add_state(act_cb, LV_STATE_CHECKED);

    // 更新当前选中的单选按钮索引
    *active_id = lv_obj_get_index(act_cb);

    // 打印当前选中的单选按钮索引
    LV_LOG_USER("Selected radio buttons: %d, %d", (int)active_index_1, (int)active_index_2);
}

// 创建单选按钮的函数
static void radiobutton_create(lv_obj_t * parent, const char * txt)
{
    // 在父容器中创建一个复选框作为单选按钮
    lv_obj_t * obj = lv_checkbox_create(parent);

    // 设置单选按钮的文本
    lv_checkbox_set_text(obj, txt);

    // 启用事件冒泡,使得点击单选按钮时事件会传递到父容器
    lv_obj_add_flag(obj, LV_OBJ_FLAG_EVENT_BUBBLE);

    // 设置单选按钮的默认样式
    lv_obj_add_style(obj, &style_radio, LV_PART_INDICATOR);

    // 设置单选按钮的选中样式
    lv_obj_add_style(obj, &style_radio_chk, LV_PART_INDICATOR | LV_STATE_CHECKED);
}

/**
* 使用复选框实现单选按钮的功能
*/
void lv_example_checkbox_2(void)
{
    /* 初始化单选按钮的样式 */
    // 初始化默认样式
    lv_style_init(&style_radio);
    lv_style_set_radius(&style_radio, LV_RADIUS_CIRCLE); // 设置默认样式为圆形

    // 初始化选中样式
    lv_style_init(&style_radio_chk);
    lv_style_set_bg_img_src(&style_radio_chk, NULL); // 设置选中样式时的背景图片

    /* 创建第一个单选按钮组 */
    // 创建一个容器用于放置单选按钮
    lv_obj_t * cont1 = lv_obj_create(lv_scr_act());
    lv_obj_set_flex_flow(cont1, LV_FLEX_FLOW_COLUMN); // 设置容器为列布局
    lv_obj_set_size(cont1, lv_pct(40), lv_pct(80));    // 设置容器大小为屏幕的40%宽和80%高
    lv_obj_add_event_cb(cont1, radio_event_handler, LV_EVENT_CLICKED, &active_index_1); // 为容器绑定点击事件回调函数

    // 创建5个单选按钮
    uint32_t i;
    char buf;
    for(i = 0; i < 5; i++) {
      lv_snprintf(buf, sizeof(buf), "A %d", (int)i + 1); // 生成单选按钮的文本
      radiobutton_create(cont1, buf);                   // 创建单选按钮并添加到容器中
    }

    // 将第一个单选按钮设置为选中状态
    lv_obj_add_state(lv_obj_get_child(cont1, 0), LV_STATE_CHECKED);

    /* 创建第二个单选按钮组 */
    // 创建另一个容器用于放置单选按钮
    lv_obj_t * cont2 = lv_obj_create(lv_scr_act());
    lv_obj_set_flex_flow(cont2, LV_FLEX_FLOW_COLUMN); // 设置容器为列布局
    lv_obj_set_size(cont2, lv_pct(40), lv_pct(80));    // 设置容器大小为屏幕的40%宽和80%高
    lv_obj_set_x(cont2, lv_pct(50));                   // 将容器放置在屏幕的右侧
    lv_obj_add_event_cb(cont2, radio_event_handler, LV_EVENT_CLICKED, &active_index_2); // 为容器绑定点击事件回调函数

    // 创建3个单选按钮
    for(i = 0; i < 3; i++) {
      lv_snprintf(buf, sizeof(buf), "B %d", (int)i + 1); // 生成单选按钮的文本
      radiobutton_create(cont2, buf);                   // 创建单选按钮并添加到容器中
    }

    // 将第一个单选按钮设置为选中状态
    lv_obj_add_state(lv_obj_get_child(cont2, 0), LV_STATE_CHECKED);
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: LVGL-复选框