LVGL v8 基础图表(Basechart)
lvsf_basechart 是 SiFli 基于 LVGL v8 原生 lv_chart 封装的自定义图表控件,用于在屏幕上绘制一条或多条数据序列(折线、柱状、散点等)。它在保留 LVGL chart 全部常用接口的同时,扩展了柱状图颜色分区、多端点柱状图和散点柱状等定制绘制能力。
主要头文件:middleware/lvgl/lvsf/gui_widgets/lvsf_basechart.h
依赖控件:LVGL chart(
LV_USE_CHART)示例工程:example/multimedia/lvgl/lvgl_v8_basechart
备注
lvsf_basechart 继承自 lv_chart_t(结构体首成员为 lv_chart_t bg),因此除下文列出的封装接口外,控件仍遵循 LVGL chart 的样式与事件模型。LV_PART_ITEMS 对应序列线条,LV_PART_INDICATOR 对应数据点标记。
功能简介
支持折线(LINE)、柱状(BAR)、散点(SCATTER)等多种图表类型,接口与 LVGL
lv_chart一一对应。支持多条数据序列,每条序列可单独指定颜色、坐标轴、显示/隐藏状态。
支持柱状图颜色分区:按数值区间映射不同颜色(
lv_basechart_color_t)。支持三种柱状图形态:普通柱状、双端点柱状(每柱两个数据)、散点柱状(相连数据点合并为一个柱子)。
支持光标(cursor)定位、轴刻度、X/Y 轴缩放、网格分割线等常规图表能力。
支持定时器定时刷新(
lv_basechart_refresh_timer()),便于滚动刷新的实时数据展示。
使用场景
实时数据曲线展示,如心率、电量、传感器波形。
柱状统计图表,如电量分段、数值区间分布。
需要按数值区间着色的仪表盘、健康数据图表。
滚动更新的流式数据序列(配合
set_next_value与定时器刷新)。
支持的开发板
sf32lb52-lcd_n16r8
sf32lb52-lchspi-ulp
配置与初始化
lvsf_basechart 依赖 LVGL chart 组件。在 menuconfig 中确认已开启图表控件:
CONFIG_LV_USE_CHART=y
BSP 中通过 LVSF_USE_BASECHART 宏控制该控件的编译(位于 lvsf 配置)。示例工程在 proj.conf 中已默认开启。
创建对象并配置的最小流程:
#include "lvsf_basechart.h"
lv_obj_t *chart = lv_basechart_create(lv_scr_act());
lv_obj_set_size(chart, 280, 180);
API 说明
控件创建与类型扩展
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
创建基础图表对象并初始化 |
|
|
图表刷新定时器回调 |
|
|
设置柱状图类型 |
|
|
设置颜色分区 |
|
|
添加简单倍数 |
|
柱状图类型枚举(lv_basechart_column_type_t):
取值 |
含义 |
|---|---|
|
正常的柱状图 |
|
有两个端点的柱状图,每个柱子需要两个数据 |
|
柱状图上的散点,相连数据点连成一个柱子 |
图表属性设置(封装自 lv_chart)
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
设置图表类型(折线/柱状等) |
|
|
设置每个数据系列的点数量 |
|
|
设置坐标轴范围 |
|
|
设置图表更新模式 |
|
|
设置网格分割线数量 |
|
|
设置 X 轴缩放比例 |
|
|
设置 Y 轴缩放比例 |
|
|
获取 X 轴缩放比例 |
返回 X 轴缩放比例 |
|
获取 Y 轴缩放比例 |
返回 Y 轴缩放比例 |
|
设置轴刻度 |
|
|
获取图表类型 |
返回图表类型 |
|
获取点数量 |
返回点数量 |
|
获取 X 轴起始点索引 |
|
|
获取指定 ID 点的坐标位置 |
|
|
强制刷新图表显示 |
无返回值 |
数据系列
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
添加数据系列 |
|
|
删除数据系列 |
|
|
隐藏/显示数据系列 |
|
|
设置数据系列颜色 |
|
|
设置 X 轴起始点 |
|
|
获取下一个数据系列 |
|
|
将系列所有点设为同一值 |
|
|
推入下一个点的值 |
常用于流式滚动更新 |
|
推入下一个点的 X/Y 值 |
|
|
设置指定 ID 点的值 |
|
|
设置指定 ID 点的 X/Y 值 |
— |
|
设置外部 Y 轴数组 |
|
|
设置外部 X 轴数组 |
|
|
获取 Y 轴数组指针 |
返回 Y 数组指针 |
|
获取 X 轴数组指针 |
返回 X 数组指针 |
|
获取用户按下的点 ID |
返回按下的点 ID |
光标
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
添加光标 |
|
|
设置光标位置 |
|
|
设置光标指向的数据点 |
|
|
获取光标指向的点坐标 |
返回光标指向的点坐标 |
典型用法
下面示例绘制两条折线序列(红色、蓝色),每条 10 个数据点,纵轴范围 0~100:
#include "lvsf_basechart.h"
void demo_basechart_init(void)
{
lv_obj_t *scr = lv_scr_act();
lv_obj_t *chart = lv_basechart_create(scr);
lv_obj_set_size(chart, 280, 180);
lv_obj_align(chart, LV_ALIGN_CENTER, 0, 10);
lv_obj_set_style_bg_color(chart, lv_color_white(), 0);
lv_obj_set_style_bg_opa(chart, LV_OPA_COVER, 0);
/* 网格颜色与线宽 */
lv_obj_set_style_line_color(chart, lv_palette_lighten(LV_PALETTE_GREY, 2), LV_PART_MAIN);
lv_obj_set_style_line_width(chart, 1, LV_PART_MAIN);
/* 序列线宽、数据点大小 */
lv_obj_set_style_line_width(chart, 3, LV_PART_ITEMS);
lv_obj_set_style_width(chart, 5, LV_PART_INDICATOR);
lv_obj_set_style_height(chart, 5, LV_PART_INDICATOR);
lv_basechart_set_type(chart, LV_CHART_TYPE_LINE);
lv_basechart_set_point_count(chart, 10);
lv_basechart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 100);
lv_basechart_set_div_line_count(chart, 5, 6);
static const lv_coord_t v1[10] = {10, 45, 30, 70, 50, 92, 60, 80, 40, 78};
static const lv_coord_t v2[10] = {80, 60, 75, 40, 55, 20, 48, 35, 65, 30};
lv_chart_series_t *s1 = lv_basechart_add_series(chart, lv_palette_main(LV_PALETTE_RED),
LV_CHART_AXIS_PRIMARY_Y);
lv_chart_series_t *s2 = lv_basechart_add_series(chart, lv_palette_main(LV_PALETTE_BLUE),
LV_CHART_AXIS_PRIMARY_Y);
for (int i = 0; i < 10; i++)
{
lv_basechart_set_next_value(chart, s1, v1[i]);
lv_basechart_set_next_value(chart, s2, v2[i]);
}
lv_basechart_refresh(chart);
}
效果展示
运行 lvgl_v8_basechart example 可查看实际效果:屏幕中央显示一个白底图表,带网格线,上面是两条折线(红、蓝),每条 10 个数据点,纵轴范围 0~100。
参考文档
源码路径:
middleware/lvgl/lvsf/gui_widgets/lvsf_basechart.h示例路径:
example/multimedia/lvgl/lvgl_v8_basechart