LVGL v8 图像数组(Imgarray)
lvsf_imgarray 是 SiFli 基于 lvsf_baseimg 封装的自定义控件,用一组图片拼出一个数值,类似数码管/翻牌显示。它能显示完整的数值形态——负号 + 整数位 + 小数点 + 小数位 + 单位,每个字形都是一张图片。给它一组字形图片(0~9 以及小数点、单位等)、整数/小数位数、小数点和单位字形的下标,再喂一个数值,它就按 [负号][整数].[小数][单位] 用这些图片拼出来。
主要头文件:middleware/lvgl/lvsf/gui_widgets/lvsf_imgarray.h
基类与类型定义:middleware/lvgl/lvsf/gui_widgets/lvsf_baseimg.h
依赖控件:LVGL img(
LV_USE_IMG)示例工程:example/multimedia/lvgl/lvgl_v8_imgarray
功能简介
用图片字形拼出数值,支持负号、整数位、小数点、小数位、单位。
支持多种数值模式:
BASEIMG_TYPE_ARRAY_INDEX(数值即图片序号)、BASEIMG_TYPE_ARRAY_Q248(Q24.8 定点,支持小数)等。可配置整数位/小数位数量、小数点/负号/单位/空字形在字形数组中的下标。
支持前导零、尾随零显示开关。
支持图像之间的间隔设置。
支持三种源数组设置方式:内存描述符数组、文件路径、单源序列帧。
使用场景
数码管风格的数值读数(电量、心率、温度、百分比)。
需要自定义字形图片的翻牌/拨盘数字显示。
表盘、仪表盘上的实时数字。
支持的开发板
sf32lb52-lcd_n16r8
sf32lb52-lchspi-ulp
配置与初始化
lvsf_imgarray 依赖 LVGL img 组件。在 menuconfig 中确认已开启:
CONFIG_LV_USE_IMG=y
BSP 中通过 LVSF_USE_IMGARRAY 宏控制该控件的编译。
创建对象的最小流程:
#include "lvsf_imgarray.h"
#include "lvsf_baseimg.h"
lv_obj_t *ia = lv_imgarray_create(lv_scr_act());
API 说明
创建与刷新
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
创建图像数组对象 |
|
|
刷新定时器回调 |
|
源数组设置
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
设置源数组(内存描述符) |
|
|
通过文件路径设置源数组 |
|
|
设置序列帧图片源和序号 |
|
布局与字形配置
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
设置图像类型 |
|
|
设置整数位数量 |
|
|
设置小数位数量 |
|
|
设置单位图像对象 |
|
|
设置小数点字形索引 |
|
|
设置负号字形索引 |
|
|
设置单位字形索引 |
|
|
设置空字形索引 |
|
|
设置前导零显示 |
|
|
设置尾随零显示 |
|
|
设置图像间隔 |
|
|
获取源数量 |
返回源数量 |
数值设置
接口函数 |
功能说明 |
参数/返回值说明 |
|---|---|---|
|
设置数值(Q24.8 格式) |
|
|
设置数值(整数格式) |
|
典型用法
下面示例显示一个像 36.5% 的测量值(2 位整数 + 1 位小数 + 小数点 + 百分号单位):
#include "lvsf_baseimg.h"
#include "lvsf_imgarray.h"
/* glyph_arr: 0..9 数字 + "."(下标10) + "%"(下标11) */
extern const lv_img_dsc_t *glyph_arr[12];
void demo_imgarray_init(void)
{
lv_obj_t *ia = lv_imgarray_create(lv_scr_act());
lv_imgarray_set_img_type(ia, BASEIMG_TYPE_ARRAY_Q248); /* Q24.8:支持小数 */
lv_imgarray_set_src_array(ia, glyph_arr, 0, 11); /* 先存字形数组 */
lv_imgarray_set_interval(ia, 2);
lv_imgarray_set_leading_zero(ia, true);
lv_imgarray_set_trailing_zero(ia, true);
lv_imgarray_set_int_num(ia, 2); /* 2 位整数 */
lv_imgarray_set_float_num(ia, 1); /* 1 位小数 */
lv_imgarray_set_point_idx(ia, 10); /* 小数点用下标 10 */
lv_imgarray_set_unit_idx(ia, 11); /* 单位用下标 11 */
lv_obj_center(ia);
lv_imgarray_set_value(ia, 365 * 256 / 10); /* 36.5 (Q24.8):显示 "36.5%" */
}
警告
调用顺序很重要:必须先 lv_imgarray_set_src_array() 存好字形数组,再调用 set_int_num() / set_point_idx() / set_unit_idx() 等——这些接口会创建对应图片单元并套用已存数组。顺序反了会因数组未就绪而异常。
效果展示
运行 lvgl_v8_imgarray example 可查看实际效果:屏幕中央显示一个带单位的小数(如 38.5%),由整数位、小数点、小数位、单位各自的图片拼成。定时器把数值在 20.0~80.0% 之间往返扫动,读数不断变化。
参考文档
源码路径:
middleware/lvgl/lvsf/gui_widgets/lvsf_imgarray.h示例路径:
example/multimedia/lvgl/lvgl_v8_imgarray