当前位置: 首页 > news >正文

LVGL- 圆弧形状控件

1 圆弧(ARH)背景介绍

ARC 是 LVGL 中用于显示圆弧形状的控件,广泛应用于需要可视化表示数值或状态的场景,

1.1 主要功能

  1. 可设置开始角度与结束角度

  2. 支持顺时针或逆时针方向

  3. 支持可拖动的 knob(控制点)

  4. 可显示当前值的数值标签

  5. 支持样式设置(颜色、宽度、背景、动画等)

1.2 应用场景

在这里插入图片描述

2 相关函数应用

2.1 创建与设置

lv_obj_t * lv_arc_create(lv_obj_t * parent);

创建一个 arc 控件,添加到指定父对象中。
在这里插入图片描述

2.2 值范围与设置

void lv_arc_set_range(lv_obj_t * arc, int32_t min, int32_t max);
void lv_arc_set_value(lv_obj_t * arc, int32_t value);
int32_t lv_arc_get_value(lv_obj_t * arc);

设置数值的最小值、最大值,以及当前值。

lv_arc_set_range(arc, 0, 100);        // 设置数值范围
lv_arc_set_value(arc, 40);            // 设置当前值
lv_obj_center(arc);                   // 居中显示

在这里插入图片描述

2.3 弧线范围(角度)

void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end);
void lv_arc_get_angles(lv_obj_t * arc, uint16_t * start, uint16_t * end);
void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end);

设置弧的开始与结束角度(以度为单位,0~360)。
0 度在正右侧(水平向右),角度按 顺时针 增加
如果 start > end,系统会理解为从 start 顺时针绕一圈到 end

lv_arc_set_angles(arc, 0, 180);
lv_arc_set_bg_angles(arc, 0, 180);

void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end);

2.4 旋转 角度

lv_arc_set_rotation() 设置 arc 控件的整体旋转角度,也就是说,它会旋转整张弧形图像,包括:

  1. 背景弧线
  2. 指示弧线
  3. 交互起点
void lv_arc_set_rotation(lv_obj_t * arc, uint16_t rotation);

lv_arc_set_rotation(arc, 180);

在这里插入图片描述

2.5 模式设置

lv_arc_set_mode() — 设置 LVGL arc 控件的模式(显示方式)

void lv_arc_set_mode(lv_obj_t * arc, lv_arc_mode_t mode);

模式选择

typedef enum {LV_ARC_MODE_NORMAL,       // 正常模式,值从 start → end 增加LV_ARC_MODE_REVERSE,      // 反向模式,值从 end → start 增加LV_ARC_MODE_SYMMETRICAL   // 对称模式,弧线在中间对称展开
} lv_arc_mode_t;

2.5.1 LV_ARC_MODE_NORMAL

指示弧线从 start 角度 向顺时针方向增加到 end。
适合用作进度条或滑动条;表示值从左下 → 顺时针 → 右下。

lv_arc_set_angles(arc, 135, 45);  // 总角度范围
lv_arc_set_mode(arc, LV_ARC_MODE_NORMAL);

运行结果跟上图一样

2.5.2 LV_ARC_MODE_REVERSE

指示弧线反向绘制,从 end 向 start 增加;
视觉上从右下→逆时针→左下;
倒计时、退度进度

这个主要用于显示,不是用于交互操作的。

2.5.3 LV_ARC_MODE_SYMMETRICAL

弧线从中心点同时向两侧对称绘制
适用于一些需要“中间为零、两边对称”的场景(例如电平、音量平衡等)

lv_arc_set_mode(arc, LV_ARC_MODE_SYMMETRICAL);
在这里插入图片描述

3 音量调节旋钮

1.使用 LV_ARC_MODE_NORMAL

2 .拖动旋钮改变值(范围 0~100)

  1. 圆形进度弧显示当前值

  2. 中心显示数值 label

  3. 自动更新显示

static void arc_event_cb(lv_event_t* e)
{lv_obj_t* arc = lv_event_get_target(e);int32_t val = lv_arc_get_value(arc);// 更新 label 显示值char buf[8];lv_snprintf(buf, sizeof(buf), "%d%%", val);lv_label_set_text(label_val, buf);lv_obj_align_to(label_val, arc, LV_ALIGN_CENTER, 0, 0);
}void create_volume_arc(void)
{// 创建 arc 对象lv_obj_t* arc = lv_arc_create(lv_scr_act());lv_obj_center(arc);// 设置角度范围(270°)lv_arc_set_angles(arc, 135, 45);// 设置值范围lv_arc_set_range(arc, 0, 100);lv_arc_set_value(arc, 60);  // 初始值// 使用 NORMAL 模式(默认)lv_arc_set_mode(arc, LV_ARC_MODE_NORMAL);// 美化样式lv_obj_set_style_arc_width(arc, 12, LV_PART_MAIN);       // 背景弧宽lv_obj_set_style_arc_width(arc, 12, LV_PART_INDICATOR);  // 值弧宽lv_obj_set_style_arc_color(arc, lv_palette_main(LV_PALETTE_BLUE), LV_PART_INDICATOR);lv_obj_set_style_bg_color(arc, lv_color_black(), LV_PART_KNOB);lv_obj_set_style_bg_opa(arc, LV_OPA_COVER, LV_PART_KNOB);// 启用可点击lv_obj_add_flag(arc, LV_OBJ_FLAG_CLICKABLE);lv_obj_add_event_cb(arc, arc_event_cb, LV_EVENT_VALUE_CHANGED, NULL);// 创建中心 label 显示数值label_val = lv_label_create(lv_scr_act());lv_label_set_text(label_val, "60%");lv_obj_set_style_text_font(label_val, &lv_font_montserrat_28, 0);lv_obj_align_to(label_val, arc, LV_ALIGN_CENTER, 0, 0);
}

在这里插入图片描述

相关文章:

  • 很啰嗦,再次总结 DOM
  • 历史数据分析——中证白酒
  • 阿里云服务器跑模型教程
  • 数学复习笔记 17
  • 数据结构*优先级队列(堆)
  • 剖析智能指针shared_ptr实现原理
  • 【软考 McCabe度量法】
  • 并发学习之synchronized,JVM内存图,线程基础知识
  • Hi3516DV500刷写固件
  • 392. Is Subsequence
  • linux线程基础
  • 摄影构图小节
  • Linux线程同步信号量
  • Vue-键盘事件
  • React学习(二)-变量
  • Centos7.9同步外网yum源至内网
  • 2025最新的软件测试面试大全(含答案+文档)
  • Java获取淘宝拍立淘API接口的详细指南
  • DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案
  • 精益数据分析(64/126):移情阶段的用户触达策略——从社交平台到精准访谈
  • 网文书单|推荐4本网文,可以当作《绍宋》代餐
  • 联合国:欢迎俄乌伊斯坦布尔会谈,希望实现全面停火
  • 上海一保租房社区亮相,首批546套房源可拎包入住
  • 广西:坚决拥护党中央对蓝天立进行审查调查的决定
  • 一种声音·阿甘本|即将到来的中世纪;“新”与“旧”……
  • 一船明月过沧州:为何这座城敢称“文武双全”?