LVGL 控件之圆弧(lv_arc)

news2024/9/26 3:28:46

目录

  • 一、圆弧部件
    • 1、部件组成
    • 2、lv_art_t
    • 3、圆弧部件角度设置
    • 4、圆弧部件旋转设置
    • 5、圆弧的模式选择
    • 6、圆弧部件的变化率设置
    • 7、移除旋钮
    • 8、事件
    • 9、获取/设置信息相关的 API
  • 二、例程


一、圆弧部件

1、部件组成

圆弧(lv_arc)部件由三个部分组成:背景弧、前景弧和旋钮,示意图如下:

在这里插入图片描述

各组成部分的相关枚举和作用如下所示:

  1. 背景弧LV_PART_MAIN):用于显示范围值;
  2. 前景弧LV_PART_INDICATOR):用于显示当前值;
  3. 旋钮LV_PART_KNOB):用于调节当前值。

2、lv_art_t

该结构体定义在 lvgl\src\widgets\arc\lv_arc.h 目录下:

typedef struct {
    lv_obj_t obj;							// 基础对象
    int32_t rotation;						// 旋转度
    lv_value_precise_t indic_angle_start;   // 前景弧起始角度
    lv_value_precise_t indic_angle_end;     // 前景弧终止角度
    lv_value_precise_t bg_angle_start;		// 背景弧起始角度
    lv_value_precise_t bg_angle_end;		// 背景弧终止角度
    int32_t value;              /* 当前圆弧值 */
    int32_t min_value;          /* 最小圆弧值 */
    int32_t max_value;          /* 最大圆弧值 */
    uint32_t dragging    : 1;
    uint32_t type        : 2;
    uint32_t min_close   : 1;   /*1: the last pressed angle was closer to minimum end*/
    uint32_t in_out      : 1;   /* 1: The click was within the background arc angles. 0: Click outside */
    uint32_t chg_rate;          /*Drag angle rate of change of the arc (degrees/sec)*/
    uint32_t last_tick;         /*Last dragging event timestamp of the arc*/
    lv_value_precise_t last_angle;         /*Last dragging angle of the arc*/
    int16_t knob_offset;        /*knob offset from the main arc*/
} lv_arc_t;

其中,value 指的是当前前景弧所指示的值,而 min_valuemax_value 指定了圆弧当前值的可变化范围。如下例:

void my_gui(void)
{
    lv_obj_t* arc = lv_arc_create(lv_scr_act());
    lv_arc_set_range(arc, 0, 100);  /* 设置arc 的范围 */
    lv_arc_set_value(arc, 50);      /* 设置arc 的值 */
    lv_obj_set_size(arc, 200, 200);
    lv_obj_align_to(arc, NULL, LV_ALIGN_CENTER, 0, 0);
}

结果如下:

3、圆弧部件角度设置

在圆弧部件默认的角度划分中,0 度(绝对度数)位于对象右侧中部(3 点钟方向),然后沿顺时针方向增加度数,直至 360 度,示意图如下:

下面是和圆弧角度设置的相关函数,分别为背景弧角度设置和前景弧角度设置:

  1. 背景弧角度设置
函数含义
lv_arc_set_bg_angles(arc, start_angle, end_angle)同时设置起始角度和终止角度
lv_arc_set_bg_start/end_angle(arc, start_angle)单独设置起始角度/终止角度
  1. 前景弧角度设置
函数含义
lv_arc_set_angles(arc, start_angle, end_angle)同时设置起始角度和终止角度
lv_arc_set_start/end_angle(arc, start_angle)单独设置起始角度/终止角度

注意:前景弧的角度范围不能超过背景弧的角度范围,否则将会出现显示异常,该异常会在下次更新布局时被修正。

例如:

void my_gui(void)
{
    lv_obj_t* arc = lv_arc_create(lv_scr_act());

    lv_arc_set_angles(arc, 270, 360);    // 设置前景弧角度
    lv_arc_set_bg_angles(arc, 270, 360); // 设置背景弧角度

    lv_obj_set_size(arc, 200, 200);
    lv_obj_align_to(arc, NULL, LV_ALIGN_CENTER, 0, 0);
}

在这里插入图片描述

前景弧和背景弧需要同时设置且值一致,否则将会出现显示异常!

4、圆弧部件旋转设置

圆弧部件旋转是指将整个部件沿顺时针方向旋转某个角度,注意:旋转的角度为相对值(增量),它的范围是 0~360 度,旋转中心为圆弧的中心。圆弧旋转的示意图如下(旋转 180 度):

注意:圆弧旋转后,它的角度划分(绝对度数)就会发生变化。

函数含义
lv_arc_set_rotation(arc, deg)设置起点的偏移量

偏移量的取值为正数,若为负数可能将造成显示异常

例:

void my_gui(void)
{
    lv_obj_t* arc = lv_arc_create(lv_scr_act());
    lv_arc_set_bg_angles(arc, 135, 45);  // 设置背景弧的起始角度和终止角度
    lv_arc_set_angles(arc, 135, 300);    // 设置前景弧的起始角度和终止角度
    
    lv_arc_set_rotation(arc, 180);         // 旋转180 度

    lv_obj_set_size(arc, 200, 200);
    lv_obj_align_to(arc, NULL, LV_ALIGN_CENTER, 0, 0);
}

可以看到,圆弧旋转了 180 度。
在这里插入图片描述

5、圆弧的模式选择

默认情况下,圆弧部件是沿顺时针方向绘制的,如果用户需要修改绘制的方向,可以调用 lv_arc_set_mode 函数,设置圆弧的绘制模式,圆弧模式相关的枚举如下所示:

  • LV_ARC_MODE_NORMAL:顺时针方向绘制;
  • ·LV_ARC_MODE_REVERSE:逆时针方向绘制;
  • LV_ARC_MODE_SYMMETRICAL:从中间点开始绘制到当前值。

当模式为 LV_ARC_MODE_REVERSE 时,请使用 lv_arc_set_value(arc, value)来设置圆弧的值,若用触摸设置,可能会出现显示异常。

可使用 lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE) 禁用弧的点击事件

逆时针设置:

从中间开始绘制:

6、圆弧部件的变化率设置

当圆弧的旋钮被滑动时,前景弧将根据设定的变化率来绘制。变化率的单位为:度/秒。默认 720 度/秒

函数含义
lv_arc_set_change_rage设置变化率

7、移除旋钮

当我们将圆弧作为进度指示器或者参数指示器来使用时,则需要移除它的旋钮,并清除可点击的属性,示例代码如下:

lv_obj_t *arc = lv_arc_create(lv_scr_act());
lv_obj_remove_style(arc, NULL, LV_PART_KNOB);   /* 移除旋钮 */
lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE);  /* 清除可点击属性 */
lv_obj_center(arc);

8、事件

  • LV_EVENT_VALUE_CHANGED:按下圆弧或者拖动按钮改变圆弧的值;
  • LV_ARC_DRAW_PART_BACKGROUND:绘制背景弧线;
  • LV_ARC_DRAW_PART_FOREGROUND:绘制前景弧线;
  • LV_ARC_DRAW_PART_KNOB :绘制旋钮。

例:当我们拖动按钮或圆弧时,中间的数值也会实时变化。

static void _arc_cb(lv_event_t* e)
{
    lv_obj_t* label = (lv_obj_t*)lv_event_get_user_data(e); // 获取传进来的用户数据label
    lv_obj_t* arc = lv_event_get_target(e);                 // 获取触发的控件arc
    uint16_t value = lv_arc_get_value(arc);                 // 获取arc当前的值
    lv_label_set_text_fmt(label, "Value: %u", value);       // 更新label的显示

    return;
}

void my_gui(void)
{
    lv_obj_t* label = lv_label_create(lv_scr_act()); // 创建用于显示当前弧的值的标签
    lv_obj_center(label);
    lv_label_set_text(label, "Value: 0");

    lv_obj_t* arc = lv_arc_create(lv_scr_act());                             // 创建圆弧
    lv_obj_add_event_cb(arc, _arc_cb, LV_EVENT_VALUE_CHANGED, (void*)label); // 添加回调函数
    lv_obj_center(arc);
    lv_arc_set_value(arc, 0);         // 设置当前值
    lv_arc_set_range(arc, 0, 100);    // 设置弧的范围
    lv_arc_set_change_rate(arc, 200); // 设置弧的速度
    
    return;
}

9、获取/设置信息相关的 API

函数含义
lv_arc_create()创建圆弧对象
lv_arc_set_start_angle()设置前景弧的起始角度
lv_arc_set_end_angle()设置前景弧的结束角度
lv_arc_set_angles()设置前景弧的开始和结束角度
lv_arc_set_bg_start_angle()设置背景弧的起始角度
lv_arc_set_bg_end_angle()设置背景弧的结束角度
lv_arc_set_bg_angles()设置背景弧的起止和结束角度
lv_arc_set_rotation()设置圆弧的旋转
lv_arc_set_mode()设置圆弧的模式
lv_arc_set_value()设置圆弧当前值
lv_arc_set_range()设置圆弧范围
lv_arc_set_change_rate()设置变化率
lv_arc_get_angle_start()获取前景弧的起始角度
lv_arc_get_angle_end()获取前景弧的结束角度
lv_arc_get_bg_angle_start()获取背景弧的起始角度
lv_arc_get_bg_angle_end()获取背景弧的结束角度
lv_arc_get_value()获取圆弧的当前值
lv_arc_get_min_value()获取圆弧的最小值
lv_arc_get_max_value()获取圆弧的最大值
lv_arc_get_mode()获取圆弧的模式

二、例程

static void arc_event_cb(lv_event_t * e)
{
   lv_obj_t * arc = lv_event_get_target(e);
   lv_obj_t * label = lv_event_get_user_data(e);

   lv_label_set_text_fmt(label, "%d", lv_arc_get_value(arc));
}

static void set_arc_value(void * obj, int32_t v)
{
    lv_arc_set_value(obj, v);

    // 通知arc和label数值已被改变
    lv_event_send(obj, LV_EVENT_VALUE_CHANGED, NULL);
}

void my_gui(void)
{
    /*Create an Arc*/
    lv_obj_t * arc = lv_arc_create(lv_scr_act());
    lv_arc_set_rotation(arc, 270);
    lv_arc_set_bg_angles(arc, 0, 360);
    lv_obj_remove_style(arc, NULL, LV_PART_KNOB);   /*Be sure the knob is not displayed*/
    lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE);  /*To not allow adjusting by click*/
    lv_obj_center(arc);

// 动画相关后面会提到
/********************************************************/
    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_var(&a, arc);
    lv_anim_set_exec_cb(&a, set_arc_value);
    lv_anim_set_time(&a, 1000);
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);    /*无限重复*/
    lv_anim_set_repeat_delay(&a, 500);
    lv_anim_set_values(&a, 0, 100);
    lv_anim_start(&a);
/********************************************************/

    // 创建label展示arc数值
    lv_obj_t * label = lv_label_create(arc);
    lv_obj_center(label);

    lv_obj_add_event_cb(arc, arc_event_cb, LV_EVENT_VALUE_CHANGED, label);  // 添加回调事件
}

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

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

相关文章

学习之SQL语言之DDL

查询 查询所有数据 SHOW DATABASES; 查询当前数据库 SELECT DATABASE(); 创建 CREATE DATABASE IF NOT EXISTS 数据库名; 删除 DROP DATABASE IF EXISTS 数据库名; 使用 USE 数据库名; 查询当前数据库所有表 SHOW TABLES; 查…

优化大型语言模型微调:MoLA层级专家分配策略

人工智能咨询培训老师叶梓 转载标明出处 大模型(LLMs)的微调过程中,计算资源的需求巨大,这促使研究者们探索参数高效微调(PEFT)技术。低秩适应(LoRA)和专家混合模型(MoE…

超分 Real-ESRGAN 使用笔记

效果图 目录 依赖项: 视频推理入口: 图片推理入口文件: RealESRGAN_x4plus 12g显存不够 RealESRGAN_x4plus_anime_6B 的效果 树枝之间产生了蒙版 RealESRNet_x4plus 有点模糊 2022年开源的 GitHub - xinntao/Real-ESRGAN: Real-ESRGAN aims at developing Practical…

操作系统 --王道计算机考研--学习笔记

文章目录 前言第一章 引言1.1 什么是操作系统?1 操作系统作为虚拟机2 操作系统作为资源管理者3 为上层提供服务-- 系统调用 2.操作系统特征与发展分类2.1 操作系统特征1.并发2.共享3.虚拟4.异步 2.2 操作系统发展和分类 3.操作系统的的运行机制和中断异常、系统调用…

vue脚手架的创建

一、安装node环境 切换阿里云镜像 npm config set registry https://registry.npm.taobao.org 2、全局安装vue-cli和webpack 已经安装过node.js之后和淘宝镜像的话,vue的运行环境基本上就搭建好了,只需再安装全局的webpack(命令行&#…

【大模型理论篇】RoPE旋转位置编码底层数学原理分析

1. 位置编码对于NLP模型的作用 位置编码(Positional Encoding)在大模型(例如Transformer架构)中起到了非常重要的作用。没有位置编码的信息,模型会丧失序列的顺序信息,导致模型退化成一个简单的“词…

物品租赁​​​​​​​|基于SprinBoot+vue的物品租赁​​​​​​​系统(源码+数据库+文档)

物品租赁系统 基于SprinBootvue的物品租赁系统 一、前言 二、系统设计 三、系统功能设计 5.1 系统功能模块 5.2 管理员功能模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…

【单片机原理及应用】实验:数码管的中断控制

目录 一、实验目的 二、实验内容 三、实验步骤 四、记录与处理 五、思考 六、成果文件提取链接 一、实验目的 掌握外部中断的工作原理,学习中断编程与程序调试方法。 二、实验内容 【参照图表】 (1)创建一个包含80C51固件,采用…

汽车乘客热舒适度大挑战,如何利用仿真技术提高汽车环境舒适度

舒适性在人们选择汽车的决定性方面占比越来越重,而汽车乘员舱环境的舒适性是指为乘员提供舒适愉快便利的乘坐环境与条件,包括良好的平顺性、车内的低噪声、适宜的空气环境以及良好的驾驶操作性能。 舒适性 经济性 安全性、动力性 典型的乘员舱热舒适性模…

git常见命令行及分支规范

文章目录 GIT常见命令行原理图基本设置初始化和克隆仓库文件管理提交更改查看状态和历史分支管理远程仓库交互高级功能GIT常见分支风格1. 单一主干分支(Single Main Branch)//极少使用优点:缺点:2. 多主干分支(Multiple Main Branches)//个人小型项目采用优点:缺点:3. …

OpenCV Jet颜色映射和HSV颜色空间对比

目录 一、概述 二、Jet颜色空间映射 2.1优势 2.2颜色变化范围 2.3应用场景 三、HSV 颜色空间 3.1优势 3.2颜色分布 3.3应用场景 四、Jet与HSV区别 4.1对比总结 4.2选择建议 OpenCV图像处理与应用实战算法汇总地址: OpenCV 图像处理应用实战算法列表汇总…

H264编码原理(二)帧内预测

假设你去了一家餐厅吃饭,这家餐厅提供了一个有趣的点餐方式。服务员会根据餐厅最近最受欢迎的菜品组合,推荐九个套餐给你。你的任务是从这九个套餐中找到一个最接近你心中想要的菜品组合的套餐,然后告诉服务员你想替换哪些菜,以得…

PS快速如何抠图章?

1、选择--色彩范围--颜色选择(反相)--确定 2、选中范围后--按delete删除非选中内容--就能得到图章 3、图层叠加来加深颜色和补全缺失点

合宙低功耗4G模组Air780EQ——开发板使用说明

CORE-AIR780E 开发板是合宙通信推出的基于 Air780E 模组所开发的, 包含电源,SIM 卡,USB,天线,音频等必要功能的最小硬件系统。 以方便用户在设计前期对Air780E模块 进行性能评估,功能调试,软件…

Python__面向对象__多态学习

目录 一、多态 1.多态定义理解 2.实例属性和类属性 3.类相关的函数 (1) 实例方法 (2)类方法 (3)静态方法 一、多态 1.多态定义理解 在Python中,多态是一种特性,类似于一个接口,允许在一个对象中的一个操作可作用在不同类型的对象上…

OpenGL3.3_C++_Windows(36)

PBR_IBL镜面部分 镜面部分并不能像漫反射部分一样将BRDF部分像常量一样提取出来,因为它整个积分上不是常数,因为它受到wi和w0的影响,就比如一个x的等式,不能把x部分提取出来一样,他是随着等式变化的如果试图解算所有入…

uni-app开发日志:将schema2code生成的新增页和修改页整合成一页

有没有想过,add和edit页面其实没多大差别? 我之前自研的系统add和edit都是一个页面,只要判断一下当前有没有id传递来,为空来就是新增。 这样如果页面修改时,才能尽量少改动代码,少出错。 对比add.vue和edit…

企业海外新闻稿发布的转型之路:从纸媒到数字化

在全球化进程加速的今天,企业的传播渠道和方式也在经历着深刻的变革。曾经占据主导地位的纸质媒体,逐渐被灵活高效的海外媒体网站所取代。企业新闻稿发布形式的转变,不仅体现了技术进步和媒体环境的变化,也标志着企业全球传播战略…

日结兼职零工平台小程序系统开发制作方案

目前在大学生和自由职业者群体中,对短期兼职零工的需求日益增长。同时,企业与个人雇主也面临着季节性和临时性用工的需求。 日结兼职零工小程序系统为寻求日结工作的求职者和需要短期劳动力的企业提供一个快速匹配的平台。实现快速发布日结兼职工作信息…

5年经验社招后端面试经历分享

这是一位读者去年的面经,他在 2023 年在百度毕业,后面拿到了快手、滴滴和京东的 offer,最终选择了京东,薪资总包是 51w。 下面是正文。 背景介绍 大家好,本人 2018 年毕业于一所普通 211 学校,专业是软件…