LVGL 控件之圆弧(lv_arc)

【LVGL学习笔记】(三)控件使用 LVGL学习笔记 阅读详情
AI摘要

本文详细介绍了LVGL控件中的圆弧(lv_arc)部件。阐述了部件组成,包括背景弧、前景弧和旋钮及其作用;说明了角度设置、旋转设置、模式选择、变化率设置等操作要点,还提及移除旋钮、事件处理以及获取/设置信息的相关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_value 和 max_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);  // 添加回调事件
}
LVGL- 圆弧形状控件 ARC 是 LVGL 中用于显示圆弧形状的控件,广泛应用于需要可视化表示数值或状态的场景。其主要功能包括设置开始与结束角度、支持顺时针或逆时针方向、可拖动的控制点、显示当前值的数值标签以及样式设置(颜色、宽度、背景、动画等)。通过相关函数,可以创建和设置 ARC 控件,包括数值范围、角度范围、旋转角度和模式设置(正常、反向、对称模式)。应用场景包括音量调节旋钮,通过拖动旋钮改变值,并实时更新显示。ARC 控件提供了丰富的自定义选项,适用于多种交互式界面设计需求。 阅读详情

相关推荐

LVGL圆弧控件lv_arc原理与工程实践指南

圆弧控件是嵌入式GUI中实现进度指示、仪表盘可视化的核心交互组件,其本质是基于角度范围约束的可拖动扇形区域。理解LVGL特有的顺时针角度定义(0°在3点钟方向)与笛卡尔坐标系下的坐标映射关系,是避免拖动失效、数值错乱等常见问题的前提。该控件通过事件驱动模型实现值同步,支持与lv_label、lv_slider等组件双向绑定,具备完整的样式定制能力(如线宽、颜色、圆角端点)。在ESP32等资源受限平台,需特别关注MicroPython的内存安全、GIL限制及性能优化策略。本文围绕lv_arc展开从底层原理、配

weixin_29781865的博客 424

ESP32 LVGL8.1 ——arc 圆弧 (arc 19)

提示:本博客作为学习笔记,有错误的地方希望指正 文章目录一、arc 简介1.1概述 Overview1.2部分和风格 Parts and Styles1.3使用 Usage1.3.1 值和角度 Value and range1.3.2 旋转 Rotation1.3.3 模式 Mode1.3.4 改变速率 Change rate1.3.4 手动设置指标 Setting the indicator manually1.4事件 Events1.5按键 Keys二、arc API三、示例3.1实现基本显示3.2

believe666的博客 4274

LVGL圆弧控件lv_arc的5个隐藏技巧:从旋转起点到反向模式,让你的UI交互更丝滑

本文深入解析LVGL圆弧控件lv_arc的5个隐藏技巧,包括旋转起点调整、反向模式应用、交互手感优化等,帮助开发者提升UI交互的流畅度。通过具体代码示例和实测数据,揭示如何巧妙利用这些特性实现专业级嵌入式界面设计,特别适合仪表盘、进度指示器等场景开发。

weixin_33724659的博客 332

LVGL 控件之(Arc)弧图形绘制

一、 图形组成 弧图形由背景弧和前景弧组成,它们有各自的起始角度和结束角度。 背景弧:

li的博客 5230

LVGL圆弧控件lv_arc的5个隐藏技巧与3个常见坑,新手避雷指南

本文深入解析LVGL圆弧控件lv_arc的5个隐藏技巧与3个常见坑,帮助开发者避免常见错误。从角度同步、逆向模式触摸陷阱到旋转偏移的数学计算,详细介绍了如何正确使用lv_arc控件,提升嵌入式UI开发效率。特别适合LVGL新手和嵌入式开发者参考。

weixin_30326515的博客 371

LVGL 8.3 -- lv_arc 圆弧:从基础绘制到高级交互的实战指南

本文详细介绍了LVGL 8.3中lv_arc圆弧控件的基础绘制与高级交互技巧。从圆弧的三大组成部分(背景弧、指示器弧和旋钮)到角度控制、样式定制和交互逻辑,提供了全面的实战指南。通过代码示例和优化建议,帮助开发者快速掌握LVGL圆弧控件的应用,提升用户界面设计效果。

weixin_32822843的博客 352

【LVGL控件学习】圆弧(lv_arc)

LVGL控件学习之圆弧(lv_arc),该文依照官方手册进行详细解读,并提供简单的使用场镜以供大家学习

HX001003的博客 5811

LVGL圆弧控件(lv_arc)的5个隐藏技巧与常见坑点排查指南

本文深入探讨了LVGL圆弧控件(lv_arc)的5个隐藏技巧与常见坑点排查方法,包括背景弧与前景弧角度设置、旋转后的角度计算、逆时针模式交互问题、变化率对流畅度的影响以及自定义旋钮样式与事件处理。这些实用技巧能帮助开发者避免常见陷阱,提升嵌入式UI开发效率。

weixin_30505225的博客 510

用LVGL的圆弧控件(lv_arc)做个智能家居仪表盘,附完整代码

本文详细介绍了如何利用LVGL的圆弧控件(lv_arc)开发智能家居仪表盘,包含温湿度监测、灯光控制和音量调节三大功能模块。通过完整的代码示例和UI设计指南,帮助开发者快速实现高颜值、交互式的嵌入式界面,特别适合物联网设备的数据可视化需求。

weixin_30897079的博客 362

LVGL多页面架构与ESP32嵌入式GUI工程实践

在嵌入式GUI开发中,页面(screen)不仅是视觉容器,更是资源隔离、事件调度与生命周期管理的核心单元。LVGL通过对象树、定时器绑定和状态机机制,实现逻辑解耦与内存可控;其多页面设计契合ESP32双核特性,支持PRO_CPU专注渲染、APP_CPU运行业务逻辑,显著提升实时性与稳定性。结合FreeRTOS任务绑定、PSRAM内存优化及线程安全API,可构建高鲁棒工业HMI系统。本文深入解析LVGL页面切换原理、圆弧控件精确控制、动态线条性能优化等关键技术,覆盖定时器陷阱规避、内存泄漏防护与跨页面数据总线

weixin_29781865的博客 323

LVGL---圆弧(lv_arc)

LVGL---圆弧(lv_arc)

weixin_42162924的博客 1176

LVGL 圆弧控件(lv_arc)实战:从进度指示器到交互式旋钮的进阶指南

本文深入探讨了LVGL的圆弧控件(lv_arc)的高级应用,从创建基础控件、理解角度与旋转机制,到实战打造无旋钮的温湿度环形指示器与可拖拽的交互式音量旋钮。文章详细解析了样式美化、平滑动画实现、事件处理及性能优化等核心技巧,旨在帮助开发者充分发挥lv_arc控件的潜力,构建流畅且专业的嵌入式UI界面。

r7s8t的博客 429

LVGL 圆弧控件 lv_arc 全面讲解:圆环进度、旋钮调节全靠它!

LVGL 中的 lv_arc 控件是一个用于绘制圆形弧线的强大工具,适用于创建圆形进度条、仪表盘刻度或旋钮控制器。它支持设置角度范围、当前值、旋转角度,并允许自定义样式(如颜色、宽度、透明度等)。lv_arc 还支持交互功能,用户可以通过拖动旋钮来改变数值,并可以监听事件以响应数值变化。通过 lv_arc_set_mode() 方法,可以设置不同的旋转模式,如正常、反向或对称模式。示例展示了如何使用 lv_arc 创建一个音量旋钮,并提供了常见功能的总结,包括创建、设置范围、值、角度、旋转、启用拖动、样式控

m0_49476241的博客 1522

LVGL圆弧控件lv_arc的5个隐藏技巧与常见坑点排查指南

本文深入解析LVGL圆弧控件lv_arc的5个隐藏技巧与常见坑点,包括角度同步设置、负值范围处理、交互控制禁用、change_rate参数优化及事件回调中的值获取策略。通过实际案例和代码示例,帮助开发者避开常见陷阱,提升嵌入式UI开发效率。

weixin_32576389的博客 194

基于开源项目构建 CFS(网络靶场实战演练)平台

摘要:构建CFS网络靶场可使用多个开源组件组合,包括EVE-NG/GNS3或ContainerLab构建网络环境,Kasm提供工作空间,CALDERA+Atomic Red Team实现攻击模拟,DetectionLab建立防御环境,Malcolm/Arkime进行流量监控,CyRIS提供编排框架,Vulhub/DVWA创建漏洞靶标。关键在于通过API深度集成各组件,同时需注重安全隔离、资源规划及维护成本。建议开发统一管理平台,结合Ansible/Terraform实现自动化部署,打造定制化实战演练环境。(

深山技术宅的博客 1842

PCIE Lane Margining Linux 环境配置

Copy all the provided files in folder PYC38 or PYC310 to the created pcie_lmt folder. Index of /ftp/python/3.8.10/Copy below commands to a file and rename it as "scan_pcie.py", the commands are from "685662 PCIe-LMT-Gen4_Gen5-r0p77.pdf" in the lane margi

mysongshine的博客 1433

LVGL 入门第六课:圆弧为什么不只是圆形滑条?一文搞懂 `lv_arc`

上一篇讲了lv_slider。滑条解决的是“当前是多少”的问题。当前亮度是多少?当前音量是多少?当前阈值是多少?当前进度是多少?一条轨道,一个旋钮,一个数值。但是在很多界面里,同样是表达“当前是多少”,我们不一定想用横向滑条。风扇转速温度仪表盘电量环形进度音量旋钮设备负载百分比倒计时圆环这些场景更适合用圆弧来表达。lv_arc刚开始学lv_arc时,很容易把它简单理解成“圆形滑条”。这个理解不算错,但还不够准确。lv_arc。

坏柠的博客 337

ARM架构下Horizon Client安装全攻略:从依赖检查到环境变量配置

本文详细介绍了在ARM架构设备上安装VMware Horizon Client的全过程,包括依赖检查、软件包获取、系统部署和环境变量配置。特别针对华为鲲鹏等ARM平台,提供了从基础准备到性能优化的完整指南,帮助用户高效完成虚拟桌面客户端的部署与调优。

github5actions的博客 551

HoloCubic 中的 LVGL Arc 圆弧控件实战:Simple Arc 静态圆弧与 Loader 加载动画的完整实现

本文以 HoloCubic 开源仓库中 LVGL 组件库自带的 Arc 圆弧控件官方示例(`lv_ex_widgets/lv_ex_arc`)为主线,系统讲解 Arc 控件从创建、角度设置到动态加载动画的完整实现路径。读者将掌握 `lv_arc_create`、`lv_arc_set_end_angle`、`lv_arc_set_bg_angles` 等核心 API 的用法与角度约定,理解背景弧、

gitblog_00223的博客 437

S7-1200PLC 与温控仪表Modbus RTU通信

硬件:cpu 1214C 目的:通过Modbus RTU协议,实现对温控仪表的控制 软件:Portal V14SP1

weixin_43922025的博客 3万+

两万字硬核指南!Python爬虫requests库从入门到精通:新手也能搞定所有爬取场景(附实战案例+避坑大全)

请求头是客户端发送给服务器的额外信息,比如User-Agent(浏览器类型)、Referer(来源页面)、Cookie(登录凭证)、(编码方式)等。Cookie是服务器存储在客户端的小型文本文件,包含用户的登录凭证、偏好设置等信息。浏览器会在每次请求时自动携带Cookie,服务器通过Cookie识别用户身份。代理IP是一个中间服务器,你的请求先发送到代理IP,再由代理IP发送到目标网站,目标网站只能看到代理IP的地址,看不到你的真实IP。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1496

使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第三十四讲)

这一期讲解的控件是圆弧(lv_arc),圆弧由背景弧、前景弧以及手柄组成,该控件的用处主要是为用户展示进度或作为可视化的输入工具。Lv_arc_set_value(arc,new_value)该函数用来设置圆弧的值。//设置背景弧135°到45°。

weixin_38828382的博客 820

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同时探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 104
上一篇: LVGL 控件之基础对象(lv_obj)
下一篇: LVGL 控件之进度条(lv_bar)
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值