LVGL 控件之仪表盘(lv_meter)

目录

  • 一、概述
  • 二、仪表盘部件
    • 1、添加刻度
    • 2、添加指针
    • 3、设置仪表的角度和仪表的范围
    • 4、装饰
      • 4.1 仪表指针图片
      • 4.2 仪表的指示刻度
      • 4.3 仪表弧线指示器
    • 5、API 函数


一、概述

仪表盘部件可以非常灵活地展示数据,其功能包括显示弧形(arcs)、指针(needles)、刻度线(ticks lines)以及标签(labels)。这意味着它可以模拟各种仪表盘样式。

仪表盘部件由四个部分组成,示意图如下:

  • LV_PART_MAIN:主体背景;
  • LV_PART_TICK:仪表的刻度;
  • LV_PART_INDICATOR:仪表指针;
  • LV_PART_ITEMS:圆弧。

二、仪表盘部件

在 LVGL 中,当用户创建出一个仪表部件时,该部件并不具备仪表的角度、仪表的范围、仪表的刻度以及仪表的指针等功能(见下图),这些功能都是由用户自行设置的。接下来,我们分别介绍这些功能的添加和设置。

lv_obj_t* meter = lv_meter_create(lv_scr_act());
lv_obj_center(meter);

1、添加刻度

刻度分为小刻度和主刻度,主刻度是图中加粗的线条,而小刻度是图中正常的线条。这些刻度的添加是由三个函数来完成,如下表所示:

函数描述
lv_meter_add_scale()添加刻度
lv_meter_set_scale_ticks()设置小刻度
lv_meter_set_scale_major_ticks()设置主刻度

上表的函数调用是有一定的顺序的,首先调用第一个函数把刻度添加到仪表当中,该函数返回一个刻度的对象,然后我们根据这个刻度的对象分别设置小刻度和主刻度。

/** * obj 指向仪表对象的指针*/
lv_meter_scale_t *lv_meter_add_scale(lv_obj_t *obj);/*** meter : 指向仪表对象的指针* scale : 指向刻度对象* cnt	 : 小刻度的数量* width : 小刻度的宽度* len   : 小刻度的长度* color : 小刻度的颜色*/
void lv_meter_set_scale_ticks(lv_obj_t *obj, lv_meter_scale_t *scale,uint16_t cnt, uint16_t width,uint16_t len, lv_color_t color);/*** meter     : 指向仪表对象的指针* scale     : 指向刻度对象* nth       : 绘画主刻度的步长* width     : 主刻度的宽度* len       : 主刻度的长度* color     : 主刻度的颜色* label_gap : 刻度与标签之间的间隙*/
void lv_meter_set_scale_major_ticks(lv_obj_t *obj, lv_meter_scale_t *scale,uint16_t nth, uint16_t width, uint16_t len,lv_color_t color, int16_t label_gap);

例:

/* 获取当前活动屏幕的宽高 */
#define scr_act_width() lv_obj_get_width(lv_scr_act())
#define scr_act_height() lv_obj_get_height(lv_scr_act())void my_gui(void) {lv_obj_t* meter = lv_meter_create(lv_scr_act());  /* 定义并创建仪表 */lv_obj_set_width(meter, scr_act_height() * 0.4);  /* 设置仪表宽度 */    lv_obj_set_height(meter, scr_act_height() * 0.4); /* 设置仪表高度 */lv_obj_center(meter);/* 设置仪表刻度 */lv_meter_scale_t* scale = lv_meter_add_scale(meter); /* 定义并添加刻度 *//* 设置小刻度数量为41,宽度为1,长度为屏幕高度除以80,颜色为灰色 */lv_meter_set_scale_ticks(meter, scale, 41, 1, scr_act_height() / 80,lv_palette_main(LV_PALETTE_GREY));/* 设置主刻度的步长为8,宽度为1,长度为屏幕高度除以60,颜色为黑色,刻度与数值的间距为屏幕高度除以30 */lv_meter_set_scale_major_ticks(meter, scale, 8, 1, scr_act_height() / 60,lv_color_black(), scr_act_height() / 30);
}

2、添加指针

仪表指针,是指用于仪表上指示数据的零部件。指针的功能就是以比较客观直接的方法指示复杂的数据结构。指针的结构一般是狭长的,一端尖,便于指示和读数。因为精确度是仪器仪表的主要性能之一,指针的这种设计和构造有利于提高仪器仪表的精度,减小误差。

在 LVGL 中,关于仪表指针的函数有两个,如下表所示:

函数描述
lv_meter_add_needle_line()添加指针
lv_meter_set_indicator_value()设置指针指向的数值
/*** obj   : 指向仪表对象的指针* scale : 指向刻度对象* width : 指针宽度* color : 指针颜色* r_mod : 修改半径长度(0:默认值;-10:默认长度-10)*/
lv_meter_indicator_t *lv_meter_add_needle_line(lv_obj_t *obj, lv_meter_scale_t *scale,uint16_t width, lv_color_t color, int16_t r_mod);/*** obj   : 指向仪表对象的指针* indic : 指向指针对象* value : 指向的数值*/
void lv_meter_set_indicator_value( lv_obj_t * obj, lv_meter_indicator_t * indic,int32_t value);

例:那么接下来再上一小节的代码中添加如下代码:

lv_meter_indicator_t* indic;
/* 添加仪表指针,该指针宽度为4,颜色为灰色,长度-10 */
indic = lv_meter_add_needle_line(meter, scale, 4,lv_palette_main(LV_PALETTE_GREY), -10);
/* 设置指针指向的数值 */
lv_meter_set_indicator_value(meter, indic,66);

3、设置仪表的角度和仪表的范围

仪表的角度主要设置仪表从顺时针旋转的角度以及有效的角度范围,比如在上一小节的示例图中,该图中的仪表有效角度范围为 0~270°,如果我们使用仪表部件制作时钟 UI,显然 0~270° 有效角度范围并不满足我们的需求,所以我们可手动设置仪表的有效角度范围为 0~360°

仪表的范围是指仪表的数值范围,默认仪表的数值范围为 0~100 的数值,我们可以手动调整数值的范围。

上述仪表的三个功能是由一个 LVGL 函数 lv_meter_set_scale_range 统一设置,见下:

/*** obj   	   : 指向仪表对象的指针* scale	   : 指向指针对象* min  	   : 最小值* max   	   : 最大值* angle_range : 最大的角度(默认是270°,可设置0~360°)* rotation    : 旋转的角度(默认是0°,可设置0~360°)*/
void lv_meter_set_scale_range(lv_obj_t * obj,lv_meter_scale_t * scale,int32_t min, int32_t max,uint32_t angle_range, uint32_t rotation);

例:这次又在前面的基础上添加一行代码:

/* 设置仪表数值范围、有效角度和旋转角度 */
lv_meter_set_scale_range(meter, scale, 0, 150, 360, 90);

4、装饰

4.1 仪表指针图片

为了提高仪表的美观度,用户可以使用图片来替代仪表的指针,这样能使仪表更加生动。仪表指针图片相关的函数 lv_meter_add_needle_img 原型如下所示:

/*** obj     : 指向仪表对象的指针* scale   : 指向刻度对象* src     : 图像源(C 数组、路径等)* pivot_x : X 枢轴点* pivot_y : Y 枢轴点*/
lv_meter_indicator_t *lv_meter_add_needle_img( lv_obj_t *obj,lv_meter_scale_t *scale,const void *src,lv_coord_t pivot_x,lv_coord_t pivot_y);

4.2 仪表的指示刻度

仪表的指示刻度是指在仪表刻度上指定某个范围刻度填充颜色,前面我们学习过 lv_meter_set_scale_tickslv_meter_set_scale_major_ticks 这两个函数,它们都有一个形参表示刻度填充的颜色,显然地,这些形参只针对整体设置颜色,并不是指定某个刻度范围设置颜色。

这个次要功能也是比较常见的,比如汽车油表,它的最低值和最大值的某范围都是使用明显的颜色提示和引导驾驶员。下面我们使用一个示意图来讲解这个功能,如下图所示:

从上图可知:我们设置仪表从 0 到 10 和 50 到 60 以某种颜色渐变,这样的功能在仪表部件中是比较常见的。关于这个功能,LVGL 官方提供了三个函数,如下表所示:

函数描述
lv_meter_add_scale_lines()添加刻度线指示刻度
lv_meter_set_indicator_start_value()设置指示刻度的起始值
lv_meter_set_indicator_end_value()设置指示刻度的终止值

上述表中的函数也是按照某些顺序执行,首先我们调用函数 lv_meter_add_scale_lines 在仪表上添加指示刻度,该函数返回指示刻度指针,然后程序根据指示刻度指针设置指示刻度的起始值和终止值,起始值和终止值无需顺序调用。

注意:如果仪表不设置起始值,则指示刻度从 0 开始;如果仪表只添加指示刻度不设置起始值和终止值,则指示刻度不会被绘画出来。

/*** obj         : 指向仪表对象的指针* scale       : 指向刻度对象* color_start : 开始颜色* color_end   : 终止颜色* local       : true: 渐变,false: 渐变(注:这两种状态看不出有任何变化)* width_mod   : 指示刻度的宽度*/
lv_meter_indicator_t *lv_meter_add_scale_lines(lv_obj_t *obj,lv_meter_scale_t *scale,lv_color_t color_start,lv_color_t color_end,bool local,int16_t width_mod);/*** obj    : 指向仪表对象的指针* indic  : 指向刻度对象* value  : 起始值*/
void lv_meter_set_indicator_start_value(lv_obj_t *obj,lv_meter_indicator_t *indic,int32_t value);/*** obj   : 指向仪表对象的指针* indic : 指向刻度对象* value : 结束值*/
void lv_meter_set_indicator_end_value(lv_obj_t *obj,lv_meter_indicator_t *indic,int32_t value);

例:

/* 添加指示刻度,起始颜色为浅蓝色,终止颜色为深蓝色,状态为true,指示刻度为10 */
indic = lv_meter_add_scale_lines(meter, scale,lv_palette_darken(LV_PALETTE_BLUE,1),lv_palette_darken(LV_PALETTE_BLUE, 4),true, 10);
/* 设置指示刻度起始值为50 */
lv_meter_set_indicator_start_value(meter, indic, 50);
/* 设置指示刻度终止值为100 */
lv_meter_set_indicator_end_value(meter, indic, 100);

4.3 仪表弧线指示器

仪表弧线指示器也是一样比较常见的仪表功能,该功能和指示刻度具有相似的效果,主要用于引导和提示用户,其示意图如下所示:

关于这个功能,LVGL 官方提供了三个函数,如下表所示:

函数描述
lv_meter_add_arc()添加弧线指示器
lv_meter_set_indicator_start_value()设置指示刻度的起始值
lv_meter_set_indicator_end_value()设置指示刻度的终止值

上表中第二、三个函数前面已经介绍过,下面看第一个函数:

/*** obj   : 指向仪表对象的指针* scale : 指向刻度对象* width : 弧线宽度* color : 弧线颜色* r_mod : 偏移值*/
lv_meter_indicator_t *lv_meter_add_arc( lv_obj_t *obj,lv_meter_scale_t *scale,uint16_t width,lv_color_t color,int16_t r_mod)

例:

/* 添加弧线指示器,弧线宽度为10,颜色为红色,偏移10 */
indic = lv_meter_add_arc(meter, scale, 10,lv_palette_main(LV_PALETTE_RED), 10);
lv_meter_set_indicator_start_value(meter, indic, 80);
lv_meter_set_indicator_end_value(meter, indic, 100);

5、API 函数

函数描述
lv_meter_create()创建仪表对象
lv_meter_add_scale()给仪表添加新刻度
lv_meter_set_scale_ticks()设置小刻度的属性
lv_meter_set_scale_major_ticks()设置主刻度的属性
lv_meter_set_scale_range()设置数值范围和角度范围
lv_meter_add_needle_line()添加指针
lv_meter_add_needle_img()添加图片指针
lv_meter_add_arc()添加弧线指示器
lv_meter_add_scale_lines()添加刻度线指示器
lv_meter_set_indicator_value()设置指针的值
lv_meter_set_indicator_start_value()设置刻度的起始值
lv_meter_set_indicator_end_value()设置刻度的终止值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144543.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树层序遍历的2种方法

方法1使用1个队列 class Solution {//使用一个队列,如果一个队列可以解决,那么就不需要使用2个数组//要最下面一层的最左边的结点,那么就先入右结点再入左结点public int findBottomLeftValue(TreeNode root) {TreeNode node root;Deque&l…

表格HTML

//test.html <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>表格与CSS分开示例</tit…

openEuler 22.03 LTS 安装JDK 8(亲测很简单的安装办法)

Oracle JDK从2019年4月16日起开始商业用途统统收费&#xff0c;也就是说只能使用2019年1月15发布的JDK 8u202免费版本&#xff0c;没有订阅&#xff08;交钱&#xff09;是没安全更新可用的&#xff0c;所以只能使用替代品OpenJDK、AdoptOpenJDK等发布版&#xff0c;那为什么不…

2024开学季好物推荐,这些开学必备好物不要错过!

又迎来了充满活力与梦想的开学季。不论是满怀憧憬步入新校园的新生&#xff0c;还是蓄势待发迎接新挑战的老生&#xff0c;为了帮助学生们更好地融入新学期的学习与生活中&#xff0c;我们特别策划了这份开学必备好物推荐指南。这里不仅汇集了能够提升学习效率的实用工具&#…

怎么快速批量生成静态二维码呢?批量静态码的3步在线生成技巧

怎么快速批量生成静态二维码呢&#xff1f;现在日常生活中的很多物品都会自己对应的二维码&#xff0c;扫码后可以查看相关物品的编码&#xff0c;那么怎么给一批物品批量生成对应的二维码呢&#xff1f;下面来教大家使用二维码批量生成工具制作静态码的方式&#xff0c;可以通…

2024/9/19 408大题专训之五段式指令流水线题型总结

结构冒险&#xff1a; 指令步骤&#xff1a;IF(取指令) ID(译码) EX&#xff08;执行、计算&#xff09;M&#xff08;访存&#xff09;WB&#xff08;写回&#xff09; 其中if和m都需要访问主存取指令和数据&#xff0c;如何解决呢&#xff1f;可以把cache分成数据cache指令…

【计网】从零开始使用TCP进行socket编程 ---服务端业务模拟Xshell

最糟糕的情况&#xff0c; 不是你出了错&#xff0c; 而是你没有面对出错的勇气。 从零开始使用TCP进行socket编程 1 通信过程的多版本实现1.1 多进程版本1.2 多线程版本 2 服务端业务模拟Xshell2.1 整体框架设计2.2 Command类设计 1 通信过程的多版本实现 在前一篇的文章…

内核是如何接收网络包的

1、数据如何从网卡到网络协议栈 1.1内核收包的过程 1、数据帧从外部网络到达网卡 2、网卡把数据帧从自己的缓存DMA(拷贝到)和内核共有的RingBuffer上 3、网卡发出硬中断通知CPU 4、CPU响应硬中断&#xff0c;简单处理后发出软中断 5、k’softirqd线程处理软中断&#xff0c;调…

ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域

ATGM331C-5T 系列模块全部支持辅助 GNSS &#xff08;AGNSS&#xff09;功能&#xff1b;支持精确秒脉冲输出&#xff0c;脉冲上升沿与 UTC 时间对齐。 产品选型&#xff1a; 性能指标&#xff1a; 出色的定位导航功能&#xff0c;支持 BDS/GPS 卫星导航系统的单系统授时&#…

基于SpringBoot+Vue+MySQL的电子产品手机商城系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着科技的飞速发展&#xff0c;电子商务已成为现代生活不可或缺的一部分。尤其是电子产品领域&#xff0c;手机作为人们日常生活中必不可少的通讯与娱乐工具&#xff0c;其市场需求持续增长。为了满足广大消费者的购物需求&…

ssrf攻击fastcgi复现及环境搭建

目录 一、环境 二、开始操作 一、环境 网上自己找vulhub-master.zip&#xff0c;我这里没用docker&#xff0c;本地自己搭建的 二、开始操作 很明显的ssrf漏洞 很明显我们之前的协议file dict 很明显9000端口是开放的 我们还是用gopherus生成一下 我们环境机上很明显有PEAR…

git报错:无法读取远程分支 ‘origin‘ does not appear to be a git repository

问题分析 push上传的时候本地分支和远程分支断开连接 所以重新链接即可 排查问题 1. 查看是否有分支&#xff0c;检查分支是否正确 git branch -v 2. 查看连接是否断开&#xff0c;断开无内容展示 查看远程仓库详细信息&#xff0c;可看到仓库地址 git remote -v 解决…

华为OD机试 - 打印机队列 - 优先队列(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

数据恢复免费版工具大比拼,哪款才是你的“救星”?

在数字时代&#xff0c;数据的重要性不言而喻&#xff1b;如果不幸遇到了数据丢失的问题&#xff0c;不要慌张&#xff0c;我这里有四款免费的数据恢复工具推荐给你&#xff1b;希望能帮助你找到最适合自己的那款“救星”&#xff01; 一、福昕数据恢复 直通车&#xff08;粘…

避免高额开发费用,如何轻松开发类似喜马拉雅的听书平台?

近年来&#xff0c;随着移动互联网的飞速发展&#xff0c;音频市场迅猛增长&#xff0c;像喜马拉雅这样的听书APP已经成为很多人生活中的重要娱乐和学习工具&#xff0c;吸引了大量用户。不过&#xff0c;很多创业者在尝试开发类似APP时&#xff0c;往往遇到开发费用高、时间长…

【已解决】Uncaught RangeError: Maximum depth reached

【已解决】Uncaught RangeError: Maximum depth reached 在JavaScript编程中&#xff0c;Uncaught RangeError: Maximum depth reached 是一个常见的错误&#xff0c;通常与递归调用深度过大有关。递归是一种编程技巧&#xff0c;它允许函数直接或间接地调用自身。然而&#xf…

oracle行转列函数 wm_concat

wm_concat()函数是oracle中独有的,mysql中有一个group_concat()函数。 这两个函数的作用是相同的&#xff0c;它们的功能是&#xff1a;实现行转列功能&#xff08;就是多行整合成一列&#xff0c;例如一个工单里有多个项目&#xff0c;工单号是一样的&#xff0c;则可以把多个…

ozon买家网址是什么,跨境电商ozon买家网址

在网购的世界里&#xff0c;每一个平台都像是一座宝藏岛&#xff0c;等待着我们去探索、去发现。而提到跨境电商&#xff0c;不得不提的一个名字就是Ozon&#xff0c;它对于许多跨境购物爱好者来说&#xff0c;简直就是打开国际购物大门的金钥匙。那么&#xff0c;今天咱们就来…

Win11|Win10电脑如何卸载软件?这3种方法帮你卸载烦人的程序。

引言 最近有粉丝问我,电脑不小心被家里的小伙子装了一大堆游戏软件,附带了很多垃圾软件,导致电脑卡顿、蓝屏异常。怎么把这些软件卸载呢?下面我将为大家分享3种卸载Windows电脑程序的方法: 解决办法: 方法1. 通过“设置”卸载: 1. 点击桌面左下角的“开始”菜单,然…

log4j2线程级动态日志级别

详见 参考 着重说明&#xff1a; DynamicThresholdFilter&#xff1a; 配置长这样&#xff1a;配置解释链接 <DynamicThresholdFilter key"logLevel" defaultThreshold"ERROR" onMatch"ACCEPT" onMismatch"DENY"><KeyVa…