使用lvgl 9 的 Arc (lv_arc) 入门指南

文章目录

    • 前言
    • 主体介绍
      • 1. **基本构造与样式**
        • 设置背景和指示器
        • 设置旋钮样式
      • 2. **值与范围**
      • 3. **角度设置**
        • 设置背景弧线的角度
        • 设置指示器的角度
      • 4. **模式切换**
      • 5. **旋钮偏移**
      • 6. **事件与交互**
        • 值变化事件
      • 7. **高级功能**
        • 点击测试
        • 动态绑定对象
    • 总结
      • 完整示例


前言

在图形用户界面 (GUI) 开发中,圆弧是一种常用的控件,可以直观地显示数值范围内的当前状态,比如进度条、调节旋钮等。在 LittlevGL(lvgl)中,lv_arc 提供了强大的功能,不仅支持丰富的样式和事件,还允许用户通过触摸或程序调整其值。本文将详细介绍 lv_arc 的用法,帮助您快速上手。


主体介绍

1. 基本构造与样式

lv_arc 由三个部分组成:

  1. 背景弧线 (LV_PART_MAIN):主弧线,用于显示完整范围。
  2. 指示器弧线 (LV_PART_INDICATOR):显示当前值的弧线。
  3. 旋钮 (LV_PART_KNOB):一个可调整的把手,用于用户交互。
设置背景和指示器

背景弧线和指示器弧线的样式通过 lv_style 属性控制。以下是创建一个基本 Arc 的示例:

lv_obj_t *arc = lv_arc_create(lv_scr_act()); // 创建 Arc
lv_obj_set_size(arc, 150, 150);             // 设置大小
lv_arc_set_bg_angles(arc, 0, 360);          // 背景弧线范围
lv_arc_set_value(arc, 50);                  // 当前值
设置旋钮样式

通过调整 padding 属性,可以改变旋钮的大小:

lv_obj_set_style_pad_all(arc, 5, LV_PART_KNOB); // 旋钮大小

2. 值与范围

Arc 的值可以通过以下函数设置:

  • 函数原型void lv_arc_set_value(lv_obj_t *arc, int32_t value);

  • 功能:设置当前值。

  • 函数原型void lv_arc_set_range(lv_obj_t *arc, int32_t min, int32_t max);

  • 功能:设置值的最小值和最大值。

示例:

lv_arc_set_range(arc, 0, 100); // 设置范围
lv_arc_set_value(arc, 75);     // 设置当前值为 75

3. 角度设置

设置背景弧线的角度
  • 函数原型void lv_arc_set_bg_angles(lv_obj_t *arc, uint16_t start_angle, uint16_t end_angle);
  • 功能:设置背景弧线的起始和结束角度。

示例:

lv_arc_set_bg_angles(arc, 0, 270); // 设置背景从 0° 到 270°
设置指示器的角度
  • 函数原型void lv_arc_set_angles(lv_obj_t *arc, uint16_t start_angle, uint16_t end_angle);
  • 功能:直接设置指示器弧线的起始和结束角度。

示例:

lv_arc_set_angles(arc, 0, 180); // 设置指示器从 0° 到 180°

4. 模式切换

Arc 提供三种模式:

  1. LV_ARC_MODE_NORMAL(默认):指示器从最小值到当前值绘制。
  2. LV_ARC_MODE_REVERSE:指示器从最大值逆时针绘制到当前值。
  3. LV_ARC_MODE_SYMMETRICAL:指示器从中心点绘制到当前值。
  • 函数原型void lv_arc_set_mode(lv_obj_t *arc, lv_arc_mode_t mode);
  • 功能:设置模式。

示例:

lv_arc_set_mode(arc, LV_ARC_MODE_REVERSE); // 逆时针模式

5. 旋钮偏移

通过旋钮偏移,可以改变旋钮的显示位置:

  • 函数原型void lv_arc_set_knob_offset(lv_obj_t *arc, uint16_t offset_angle);
  • 功能:设置旋钮的偏移角度。

示例:

lv_arc_set_knob_offset(arc, 30); // 将旋钮偏移 30°

6. 事件与交互

值变化事件

Arc 支持 LV_EVENT_VALUE_CHANGED 事件,用于响应值的更改。

void arc_event_cb(lv_event_t *e) {lv_obj_t *arc = lv_event_get_target(e);int32_t value = lv_arc_get_value(arc);printf("Arc value changed: %d\n", value);
}lv_obj_add_event_cb(arc, arc_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

7. 高级功能

点击测试

通过 LV_OBJ_FLAG_ADV_HITTEST,可以设置点击区域为弧线区域:

lv_obj_add_flag(arc, LV_OBJ_FLAG_ADV_HITTEST);
动态绑定对象

可以绑定一个对象使其跟随 Arc 的旋转:

  • 函数原型void lv_arc_align_obj_to_angle(lv_obj_t *arc, lv_obj_t *obj, int16_t radius_offset);

示例:

lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "Knob");
lv_arc_align_obj_to_angle(arc, label, 10); // 让 label 跟随 Arc 的角度变化

总结

通过本文的介绍,我们了解了 LittlevGL 中 Arc 控件的功能及用法,包括基础样式、值设置、角度控制、模式切换以及事件处理。以下是完整的示例代码:

完整示例

#include "lvgl.h"void arc_event_cb(lv_event_t *e) {lv_obj_t *arc = lv_event_get_target(e);int32_t value = lv_arc_get_value(arc);printf("Current Value: %d\n", value);
}void create_arc_demo() {lv_obj_t *arc = lv_arc_create(lv_scr_act());lv_obj_set_size(arc, 150, 150);lv_arc_set_range(arc, 0, 100);lv_arc_set_value(arc, 50);lv_arc_set_bg_angles(arc, 0, 270);lv_arc_set_knob_offset(arc, 10);lv_obj_add_event_cb(arc, arc_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}int main() {lv_init();create_arc_demo();while (1) {lv_task_handler();}
}

通过这段代码,您可以在设备上显示一个可交互的 Arc,并处理值变化事件。希望本文能够帮助您熟练掌握 lv_arc 的使用!

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

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

相关文章

【力扣热题100】—— Day4.反转链表

你不会永远顺遂,更不会一直年轻,你太安静了,是时候出发了 —— 24.12.2 206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出&…

【AWS re:Invent 2024】一文了解EKS新功能:Amazon EKS Auto Mode

文章目录 一、为什么要使用 Amazon EKS Auto Mode?二、Amazon EKS自动模式特性2.1 持续优化计算成本2.2 迁移集群操作2.3 EKS 自动模式的高级功能 三、EKS Auto 集群快速创建集群配置四、查看来自 API 服务器的指标五、EKS 相关角色权限设置六、参考链接 一、为什么…

记事本建java及java命名规范

1.桌面开发:c# 2. 记事本建java: 以class的名称(类名)为名,名称.java 编译jdk:javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容:cat 名称.java java 的命名规范 大驼峰(每个单词首…

过程管理系统(源码+文档+部署+讲解)

本文将深入解析“过程管理系统”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 过程管理系统是一款专为工业设计的综合管理平台,旨在通过集成各种管理流程和功能模块来提高管理效率和安全性。系统提供了从登录系…

期权懂|个股期权交割操作流程是什么样的?

期权小懂每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 个股期权交割操作流程是什么样的? 一、行权申报: 期权买方在行权日通过其经纪商提交行权指令,表明其决定行使期权权利。 二、行权匹配&#xf…

智能仓储:入库业务流程介绍

01 入库流程 入库业务流程,常见过程是这样的: 创建PO单 > 创建到货清单 > 核对货物 > 入库质检 > 货物贴标签 > 上架 > 库存同步 1、创建PO单 po单指的是的采购订单,比如采购了一车货品,这车的货品可以理解…

MySQL并发控制(一):幻读

假设有如下表结构: CREATE TABLE t(id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25); 问:如果执行…

Ubuntu22.04中mysql8 rpm安装

1、安装依赖 sudo apt update sudo apt -y dist-upgrade sudo apt -y install vim net-tools wget gcc make cmake lrzsz sudo apt -y install libmecab2 libjson-perl 2、下载rpm文件 https://dev.mysql.com/downloads/mysql/ https://cdn.mysql.com//Downloads/MySQL-8.0/m…

Intel 性能分析“全家桶” For HPC(一)

本系列是对于HPC应用性能分析涉及的主要方法论及Intel主流工具分享。理解这些方法论将有助于对性能分析结果的理解。同时方法论也可以推广到其他的硬件平台的分析上。除此之外后面也将介绍如何用Vtune, Advisor以及ITAC进行性能分析,以及在性能分析过程中这三种性能…

Qwen1.8B大模型微调流程

提示:本篇笔记是在微调大模型为法律相关模型的教程下记录的,参考的讲解视频在B站上,一搜微调大模型为法律大模型就有很多视频。 文章目录 1. 数据集1.1 数据下载1.2 数据格式转换 2. 模型训练2.1 安装依赖2.2 模型训练 3. 模型推理3.1 LoRA模…

第十六章 使用 iSCSI 服务部署网络存储

1. iSCSI 技术介绍 硬盘是计算机硬件设备中重要的组成部分之一,硬盘存储设备读写速度的快慢也会对服务器的整体性能造成影响。硬盘存储结构、RAID 磁盘阵列技术以及LVM 技术等都是用于存储设备的技术,尽管这些技术有软件层面和硬件层面之分&#xff0c…

【js面试题】JavaScript 中箭头函数与普通函数的深度剖析

在 JavaScript 编程的世界里,函数是极为重要的组成部分。而随着 ES6 的出现,箭头函数成为了 JavaScript 函数家族中的新成员。它与传统的普通函数有着诸多的不同之处,这些差异深刻地影响着我们编写代码的方式以及代码的执行逻辑。本文将对 Ja…

【漫话机器学习系列】Adaboost算法

Adaboost(Adaptive Boosting)是一种经典的集成学习方法,主要思想是通过将多个弱学习器(通常是简单模型,如决策树桩)加权组合,来提升整体模型的预测能力。Adaboost 是一种自适应的学习方法&#…

SQL靶场第四关

sql靶场第四关攻略 输入?id1页面正常 输入?id1发现页面也正常 输入?id1",页面异常,说明存在sql报错注入 在输入?id1" --页面还是报错 1.判断闭合点 我们需要找到闭合点,尝试在双引号后面加个) 输入?id1") --我们发现…

Trunk链路操作题

Trunk链路操作题 论证:

Alogrithm:三色棋

1. 说明 三色旗的问题最早由 E.W.Diikstra 所提出,他所使用的用语为 Dutch Nation Flag(Dijkstra 为荷兰人),而多数的作者则使用 Three-Color Flag 来称之。 假设有一条绳子,上面有红、白、蓝三种颜色的旗子&#xff0…

需要排序的子数组

题目描述 给定一个无序数组arr,求出需要排序的最短子数组长度 要求:O(N) 如输入:arr{2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序。 分析 以{2,3,7,5,4,6,8,9}为例: 前端小于最小波谷(3…

Python酷库之旅-第三方库Pandas(154)

目录 一、用法精讲 701、pandas.Timestamp.utcnow方法 701-1、语法 701-2、参数 701-3、功能 701-4、返回值 701-5、说明 701-6、用法 701-6-1、数据准备 701-6-2、代码示例 701-6-3、结果输出 702、pandas.Timestamp.utcoffset方法 702-1、语法 702-2、参数 70…

如何启动神通数据库?神通数据库的启动方式一共有几种?

简单总结,神通数据库启动有三种方式: 1、dba管理工具方式 2、服务方式 (1)service oscardb_OSRDBd restart (2)/etc/init.d/oscardb_OSRDBd restart (3)systemctl start oscardb_OS…

Modbus Poll的使用

最近从串口调试助手接触到了Modbus Poll,一开始用的时候有些生疏,了解之后不得不说真香。 相对于串口调试助手,有些设备厂家会给一些点表和指令码,有些也可以通过modbus协议解析出来,相对来说,使用Modbus …