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]