LVGL-表格
lv_table_create用于创建表格
lv_obj_t * lv_table_create(lv_obj_t * parent);
//parent:父对象的指针
//ret:返回指向新创建的表格对象的指针lv_table_set_cell_value
用于设置表格(lv_table)单元格内容的函数。通过此函数,可以为表格的每个单元格设置文本内容
void lv_table_set_cell_value(lv_obj_t * table, uint32_t row, uint32_t col, const char * txt);
//table:指向表格对象的指针
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//txt:要设置的文本内容lv_table_set_cell_value_fmt
用于设置表格(lv_table)单元格内容的函数,支持格式化字符串。它类似于 C 语言中的 printf 函数,可以将变量格式化为字符串并设置到单元格中
void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, const char * fmt, ...);
//obj:指向表格对象的指针
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//fmt:格式化字符串,类似于 printf 中的格式化字符串,例如 "%d"、"%s" 等lv_table_set_row_cnt
用于设置表格(lv_table)行数
void lv_table_set_row_cnt(lv_obj_t * table, uint16_t row_cnt);
//table:指向表格对象的指针
//row_cnt:要设置的行数lv_table_set_col_cnt
用于设置表格(lv_table)列数
void lv_table_set_col_cnt(lv_obj_t * table, uint16_t col_cnt);
//table:指向表格对象的指针
//col_cnt:要设置的列数lv_table_set_col_width
用于设置表格(lv_table)某一列的宽度的函数
void lv_table_set_col_width(lv_obj_t * table, uint16_t col, uint16_t width);
//table:指向表格对象的指针
//col:要设置宽度的列索引(从 0 开始)
//width:该列的宽度,单位为像素lv_table_add_cell_ctrl
用于向表格(lv_table)的指定单元格添加控制标志的函数。这些控制标志可以改变单元格的行为或外观,例如合并单元格或裁剪文本
void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl);
//obj:指向表格对象的指针。
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//ctrl:要添加的控制标志
/*
LV_TABLE_CELL_CTRL_MERGE_RIGHT:将当前单元格与右侧单元格合并。
LV_TABLE_CELL_CTRL_TEXT_CROP:裁剪单元格内的文本(实际效果可能因版本而异)。
LV_TABLE_CELL_CTRL_CUSTOM_1 到 LV_TABLE_CELL_CTRL_CUSTOM_4:自定义控制标志,可用于自定义单元格的行为
*/lv_table_clear_cell_ctrl
用于清除表格(lv_table)单元格的控制标志
void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl);
//obj:指向表格对象的指针。
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//ctrl:要清除的控制标志lv_table_set_cell_user_data
用于为表格(lv_table)的单元格设置用户自定义数据的函数。通过此函数,可以将任意数据(例如指针或整数)与表格的单元格关联起来,以便在事件处理或其他逻辑中使用。
void lv_table_set_cell_user_data(lv_obj_t * table, uint16_t row, uint16_t col, void * user_data);
//table:指向表格对象的指针。
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//user_data:要设置的用户自定义数据。可以是任意指针或整数lv_table_get_cell_value
用于获取表格(lv_table)单元格内容的函数
const char * lv_table_get_cell_value(const lv_obj_t * table, uint16_t row, uint16_t col);
//table:指向表格对象的指针
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//ret:返回一个指向单元格内容的字符串。如果单元格没有内容,返回值可能是 NULL 或空字符串lv_table_get_row_cnt
用于获取表格(lv_table)当前行数
uint16_t lv_table_get_row_cnt(const lv_obj_t * table);
//table:指向表格对象的指针
//ret:返回表格的当前行数lv_table_get_col_cnt
用于获取表格(lv_table)当前列数
uint16_t lv_table_get_col_cnt(const lv_obj_t * table);
//table:指向表格对象的指针
//ret:返回表格的当前列数lv_table_get_col_width
用于获取表格(lv_table)某一列宽度的函数
lv_coord_t lv_table_get_col_width(const lv_obj_t * table, uint16_t col_id);
//table:指向表格对象的指针。
//col_id:要获取宽度的列索引(从 0 开始)
//ret:返回指定列的宽度,单位为像素lv_table_has_cell_ctrl
用于检查表格(lv_table)的某个单元格是否具有特定控制标志的函数。通过此函数,可以查询单元格是否设置了如合并单元格或裁剪文本等控制标志
bool lv_table_has_cell_ctrl(const lv_obj_t * table, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl);
//table:指向表格对象的指针
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//ctrl:要检查的控制标志
//LV_TABLE_CELL_CTRL_MERGE_RIGHT:检查单元格是否与右侧单元格合并
//LV_TABLE_CELL_CTRL_TEXT_CROP:检查单元格文本是否被裁剪
//LV_TABLE_CELL_CTRL_CUSTOM_1 到 LV_TABLE_CELL_CTRL_CUSTOM_4:检查自定义控制标志
//ret:返回一个布尔值:true:表示单元格具有指定的控制标志。false:表示单元格不具有指定的控制标志lv_table_get_selected_cell
用于获取表格(lv_table)当前选中单元格的行和列索引的函数
bool lv_table_get_selected_cell(const lv_obj_t * table, uint16_t * row, uint16_t * col);
//table:指向表格对象的指针
//row:指向一个 uint16_t 类型的变量,用于存储选中单元格的行索引
//col:指向一个 uint16_t 类型的变量,用于存储选中单元格的列索引lv_table_get_cell_user_data
用于获取表格(lv_table)单元格的用户自定义数据的函数
void* lv_table_get_cell_user_data(const lv_obj_t * table, uint16_t row, uint16_t col);
//table:指向表格对象的指针
//row:单元格所在的行索引(从 0 开始)
//col:单元格所在的列索引(从 0 开始)
//ret:返回单元格的用户自定义数据的指针。如果未设置用户数据,返回 NULL/**
* 使用表格创建轻量级列表示例
* 实现了带开关状态的高效列表显示
*/
#if LV_USE_TABLE && LV_BUILD_EXAMPLES
#define ITEM_CNT 200// 列表项数量
// 自定义绘制事件回调 - 用于绘制单元格中的开关控件
static void draw_event_cb(lv_event_t * e)
{
lv_obj_t * obj = lv_event_get_target(e);// 获取触发事件的表格对象
lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);// 获取绘制部件描述符
// 如果正在绘制单元格内容
if(dsc->part == LV_PART_ITEMS) {
// 检查当前单元格是否设置了自定义控制标志1(表示开关状态)
bool chk = lv_table_has_cell_ctrl(obj, dsc->id, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
// 初始化矩形绘制描述符
lv_draw_rect_dsc_t rect_dsc;
lv_draw_rect_dsc_init(&rect_dsc);
// 根据开关状态设置背景颜色
rect_dsc.bg_color = chk ? lv_theme_get_color_primary(obj) : lv_palette_lighten(LV_PALETTE_GREY, 2);
rect_dsc.radius = LV_RADIUS_CIRCLE;// 设置圆角为圆形,形成开关背景
// 定义开关控件区域
lv_area_t sw_area;
sw_area.x1 = dsc->draw_area->x2 - 50;// 靠右对齐
sw_area.x2 = sw_area.x1 + 40;
sw_area.y1 = dsc->draw_area->y1 + lv_area_get_height(dsc->draw_area) / 2 - 10;// 垂直居中
sw_area.y2 = sw_area.y1 + 20;
// 绘制开关背景
lv_draw_rect(dsc->draw_ctx, &rect_dsc, &sw_area);
// 设置开关按钮颜色
rect_dsc.bg_color = lv_color_white();
// 根据开关状态调整按钮位置
if(chk) {
sw_area.x2 -= 2;
sw_area.x1 = sw_area.x2 - 16;// 打开状态:按钮靠右
}
else {
sw_area.x1 += 2;
sw_area.x2 = sw_area.x1 + 16;// 关闭状态:按钮靠左
}
sw_area.y1 += 2;
sw_area.y2 -= 2;// 缩小一点,形成内凹效果
// 绘制开关按钮
lv_draw_rect(dsc->draw_ctx, &rect_dsc, &sw_area);
}
}
// 单元格值改变事件回调 - 处理开关状态切换
static void change_event_cb(lv_event_t * e)
{
lv_obj_t * obj = lv_event_get_target(e);// 获取触发事件的表格对象
uint16_t col, row;
lv_table_get_selected_cell(obj, &row, &col);// 获取选中单元格坐标
// 检查当前开关状态
bool chk = lv_table_has_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
// 切换开关状态
if(chk) lv_table_clear_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
else lv_table_add_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
}
/**
* 使用表格创建轻量级列表
*/
void lv_example_table_2(void)
{
/*内存使用监测*/
lv_mem_monitor_t mon1;
lv_mem_monitor(&mon1);// 记录初始内存状态
uint32_t t = lv_tick_get();// 记录开始时间
// 创建表格对象
lv_obj_t * table = lv_table_create(lv_scr_act());
// 设置表格高度,使其可滚动
lv_obj_set_size(table, LV_SIZE_CONTENT, 200);
// 设置列宽和行列数量
lv_table_set_col_width(table, 0, 150);
lv_table_set_row_cnt(table, ITEM_CNT);// 预分配足够行数,避免动态内存重分配
lv_table_set_col_cnt(table, 1);
// 移除单元格按下状态样式,使用自定义绘制
lv_obj_remove_style(table, NULL, LV_PART_ITEMS | LV_STATE_PRESSED);
// 填充表格数据
uint32_t i;
for(i = 0; i < ITEM_CNT; i++) {
lv_table_set_cell_value_fmt(table, i, 0, "Item %"LV_PRIu32, i + 1);// 设置单元格文本
}
// 将表格居中对齐
lv_obj_align(table, LV_ALIGN_CENTER, 0, -20);
// 添加自定义绘制事件回调
lv_obj_add_event_cb(table, draw_event_cb, LV_EVENT_DRAW_PART_END, NULL);
// 添加值改变事件回调
lv_obj_add_event_cb(table, change_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
// 内存使用监测
lv_mem_monitor_t mon2;
lv_mem_monitor(&mon2);// 记录完成后内存状态
// 计算内存使用和时间消耗
uint32_t mem_used = mon1.free_size - mon2.free_size;
uint32_t elaps = lv_tick_elaps(t);
// 创建信息标签显示性能数据
lv_obj_t * label = lv_label_create(lv_scr_act());
lv_label_set_text_fmt(label, "%"LV_PRIu32" items were created in %"LV_PRIu32" ms\n"
"using %"LV_PRIu32" bytes of memory",
ITEM_CNT, elaps, mem_used);
// 将标签放置在底部
lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -10);
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]