使用lvgl9 的 Chart (lv_chart) 控件指南

文章目录


前言

图表是数据可视化的重要工具,lv_chart 是 LittlevGL 提供的一个灵活的控件,用于展示数据点和趋势。它支持多种图表类型(折线图、柱状图、散点图等)以及丰富的交互功能,如滚动、缩放和光标跟踪。本文将详细介绍 lv_chart 的功能、用法及示例代码。


主体介绍

1. 图表概述

lv_chart 支持以下功能:

  • 图表类型:折线图、柱状图、散点图。
  • 双 y 轴:支持左侧和右侧独立的 y 轴。
  • 分隔线:横向和纵向分隔线。
  • 缩放与滚动:可通过容器实现缩放与滚动。
  • 光标:动态显示特定点的坐标。

2. 样式部分

样式定义
  • LV_PART_MAIN :控制图表背景、分隔线样式,以及内容区的内边距(padding)。对于柱状图,pad_column 控制同一索引的列间距。
  • LV_PART_ITEMS:控制折线、柱状图的样式,包括线条宽度、颜色、点的半径等。
  • LV_PART_INDICATOR:用于折线图或散点图中点的样式(小圆点或方块)。
  • LV_PART_CURSOR:用于设置光标的样式,如颜色、宽度和形状。

3. 图表功能

图表类型

lv_chart 支持以下图表类型:

  • LV_CHART_TYPE_NONE:不显示任何数据。
  • LV_CHART_TYPE_LINE:折线图。
  • LV_CHART_TYPE_BAR:柱状图。
  • LV_CHART_TYPE_SCATTER:散点图,支持点与点之间连线。

设置图表类型的示例:

c 复制代码
lv_chart_set_type(chart, LV_CHART_TYPE_LINE); // 设置为折线图

数据系列

图表可以包含多个数据系列,每个系列独立表示一组数据。添加数据系列的方法:

c 复制代码
lv_chart_series_t *ser = lv_chart_add_series(chart, lv_color_blue(), LV_CHART_AXIS_PRIMARY_Y); 
// 创建一个与左侧 y 轴关联的蓝色数据系列

如果需要动态更新数据,可以使用外部数组:

c 复制代码
static int32_t data_array[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
lv_chart_set_ext_y_array(chart, ser, data_array); // 绑定外部数组到数据系列

数据更新后,调用以下函数刷新图表:

c 复制代码
lv_chart_refresh(chart);

数据修改

您可以通过以下几种方式修改数据:

  1. 直接设置值

    c 复制代码
    ser->y_points[3] = 50; // 修改第 4 个点的值为 50
    lv_chart_refresh(chart);
  2. 按索引设置值

    c 复制代码
    lv_chart_set_value_by_id(chart, ser, 2, 75); // 修改第 3 个点的值为 75
  3. 顺序追加值

    c 复制代码
    lv_chart_set_next_value(chart, ser, 85); // 将值 85 追加到数据系列中
  4. 初始化所有点

    c 复制代码
    lv_chart_set_all_value(chart, ser, 0); // 初始化所有点为 0

对于散点图,可通过以下方法设置 x 和 y 值:

c 复制代码
lv_chart_set_next_value2(chart, ser, 15, 20); // 追加 (15, 20) 点到散点图

更新模式

lv_chart_set_next_value() 支持两种更新模式:

  • LV_CHART_UPDATE_MODE_SHIFT:将旧数据左移,新增数据添加到右侧。
  • LV_CHART_UPDATE_MODE_CIRCULAR:循环更新数据,类似于心电图效果。

设置更新模式的示例:

c 复制代码
lv_chart_set_update_mode(chart, LV_CHART_UPDATE_MODE_SHIFT);

数据点个数

可以使用以下方法设置每个数据系列的点数量:

c 复制代码
lv_chart_set_point_count(chart, 20); // 设置每个数据系列包含 20 个点

注意:外部数组的大小需与点数一致。


轴范围

可以通过以下方法设置 y 轴的范围:

c 复制代码
lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 100); // 设置左 y 轴范围为 0 到 100

分隔线

设置横向和纵向分隔线的数量:

c 复制代码
lv_chart_set_div_line_count(chart, 4, 6); // 设置 4 条水平线和 6 条垂直线

光标

可以为图表添加光标以显示特定点的坐标:

c 复制代码
lv_chart_cursor_t *cursor = lv_chart_add_cursor(chart, lv_color_red(), LV_DIR_VER); // 添加红色垂直光标

设置光标位置:

c 复制代码
lv_point_t point = {10, 50}; // 光标位置
lv_chart_set_cursor_pos(chart, cursor, &point);

4. 事件处理

当用户点击某个点时,会触发 LV_EVENT_VALUE_CHANGED 事件:

c 复制代码
void chart_event_cb(lv_event_t *e) {
    lv_obj_t *chart = lv_event_get_target(e);
    int point_id = lv_chart_get_pressed_point(chart); // 获取被点击点的索引
    printf("Pressed point: %d\n", point_id);
}
lv_obj_add_event_cb(chart, chart_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

5. 完整示例代码

以下示例展示了如何创建一个包含折线图和光标的动态图表:

c 复制代码
#include "lvgl.h"

void chart_event_cb(lv_event_t *e) {
    lv_obj_t *chart = lv_event_get_target(e);
    int point_id = lv_chart_get_pressed_point(chart);
    if (point_id >= 0) {
        printf("Pressed point index: %d\n", point_id);
    }
}

void create_chart_demo() {
    // 创建图表对象
    lv_obj_t *chart = lv_chart_create(lv_scr_act());
    lv_obj_set_size(chart, 300, 200);
    lv_obj_center(chart);

    // 设置图表类型为折线图
    lv_chart_set_type(chart, LV_CHART_TYPE_LINE);

    // 添加数据系列
    lv_chart_series_t *ser = lv_chart_add_series(chart, lv_color_blue(), LV_CHART_AXIS_PRIMARY_Y);

    // 初始化数据
    lv_chart_set_point_count(chart, 10);
    lv_chart_set_all_value(chart, ser, 50);

    // 添加光标
    lv_chart_cursor_t *cursor = lv_chart_add_cursor(chart, lv_color_red(), LV_DIR_VER);

    // 设置光标位置
    lv_point_t point = {5, 75};
    lv_chart_set_cursor_pos(chart, cursor, &point);

    // 注册事件回调
    lv_obj_add_event_cb(chart, chart_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

int main() {
    lv_init();
    create_chart_demo();
    while (1) {
        lv_task_handler();
    }
}

运行以上代码,您将看到一个动态的折线图,支持光标操作和数据更新。通过点击图表上的点,可以触发事件并获取点的索引。


总结

lv_chart 是 LittlevGL 提供的强大控件,支持多种图表类型和丰富的交互功能。通过本文的介绍,相信您可以快速上手并构建出满足需求的图表组件。

相关推荐
编程咕咕gu-24 分钟前
从零开始玩python--python版植物大战僵尸来袭
开发语言·python·python基础·pygame·python教程
柏木乃一30 分钟前
双向链表增删改查的模拟实现
开发语言·数据结构·算法·链表
cherryc_1 小时前
JavaSE基础——第六章 类与对象(二)
java·开发语言
阿波c麻了3 小时前
第十五届单片机模拟考试III
单片机·嵌入式硬件
同勉共进3 小时前
虚函数表里有什么?(二)——普通单继承下的虚函数表
c++·单继承·虚函数表·dynamic_cast·rtii
天天爱吃肉82185 小时前
【国产工具链发展,生态链分析,TSMaster VS Zcanpro的技术对比】
单片机·嵌入式硬件·汽车·学习方法
永恒迷星.by5 小时前
文件操作(c语言)
c语言·c++·算法·文件操作
Qlittleboy5 小时前
windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
开发语言·windows·php
水w6 小时前
【Android Studio】解决报错问题Algorithm HmacPBESHA256 not available
android·开发语言·android studio
冷琅辞7 小时前
Elixir语言的云计算
开发语言·后端·golang