LVGL线条和画布功能

线条部件 

线条部件由多个点连接而成,它可用于修饰界面或者展示数据。

要注意这里的描述,线条是由多个点连接而成的。

线条部件只有一个组成部分:主体 LV_PART_MAIN

线条是由多个点连接而成的对象,用户可以使用 lv_point_t 类型的数组存储这些坐标点,并调用 lv_line_set_points 函数,把这些坐标点传递给线条部件,它将会把这些点连接起来,最终绘制成线条。

接下来,我们以简单示例来理解线条连接点的设置,示例代码如下所示:

在上述源码中,我们先创建连接点相关的数组,然后创建一个线条部件,最后将点数组传入到线条部件中,其将会把这些点连接起来。示例代码可以在 PC 模拟器中运行,效果图如下所示:

上图中,因为线条部件被居中对齐,所以坐标原点在该部件居中后的左上方,如下图所示:

这里要注意,点的坐标起点是以线条部件为准,而不是整个屏幕的左上角。

自适应大小

默认情况下,线条部件的宽度和高度都是 LV_SIZE_CONTENT,这意味着它将自动设置自身的大小,以适应所有的点。如果用户设置了线条部件的大小,则超出的部分可能不可见。

箭头?

注意,lvgl的线条没有自带箭头属性,如果需要带箭头的线条,就需要想其他办法。

坐标点显示

使用线条来显示各种图形,其实就是各个点的坐标传递到线条部件里面,因此,关键其实是图形的坐标,比如要想显示正弦曲线,就得先得到正弦曲线的离散点坐标数组,然后传递到线条对象中。

gui guider中的线条部件使用

我们再来看看gui guider里面的对应设置

注意,线条部件只能绘制直线条。

使用gui guider绘制页面过程中遇到问题,怎么绘制填充的三角形和圆形?找了半天,线条只能画不填充的多边形,能画圆形的更是压根没有对应的组件。

注意:如果想要绘制矩形(可带圆角),可以直接使用按钮部件。

于是我就奇了怪了,难道lvgl压根没法画形状?

但是也不可能呀,lvgl已经这么成熟了,怎么可能连最基本的形状都绘制不了呢?

于是去CSDN问了下人工智能:

难道画布能解决这个问题?

为了解决这个疑惑,就去了解下该部件:画布

画布部件 

LVGL 的画布部件中,用户可以绘制任何内容,并为其添加特殊效果,该部件会使用LVGL 的绘图引擎来绘制这些内容。

画布部件只有一个组成部分:主体 LV_PART_MAIN

画布的创建流程很简单,一共有三个步骤:

① 为画布申请缓冲区内存;

② 创建画布部件;

③ 为画布设置缓冲区。

接下来,我们以一个简单的示例帮助大家理解画布的创建流程,示例代码如下:

在上述源码中,我们先定义一个缓冲区数组,该数组用于存储需要绘制的图像数据,有了缓冲区之后,就可以创建一个画布并为其设置缓冲区。

其实就是将自定义目标图像的像素数据给绘制出来。

其它部件其实也是刷入对应像素数据,只不过其它部件都是lvgl定制好的,画布允许我们自定义图案来进行绘制。

画布调色板设置

用户需要设置调色板,可以调用 lv_canvas_set_palette 函数,示例如下:

lv_canvas_set_palette(canvas, 3, LV_COLOR_RED);

上述源码表示:将标识为 3 的像素设置为红色。

画布部件的绘画

画布部件可以绘制矩形、文本、图片和线条等,相关的绘制函数如下:

接下来,我们结合源码,以绘画矩形为例,帮助大家理解绘画的配置流程,示例代码如下:

由上述源码可知,绘画的配置流程一共有三步:

① 定义画布相关的描述符,例如:lv_draw_rect_dsc_t rect_dsc

② 调用 lv_draw_rect_dsc_init 初始化函数。

③ 设置各种属性(开始绘画)。

示例代码可以在 PC 模拟器中运行,效果图如下所示:

画布部件的旋转

如果用户需要旋转画布中的图像,则可以调用 lv_canvas_transform 函数来设置,旋转后的

结果将会存储在画布上。lv_canvas_transform 函数的入口参数如下表所示:

注意:画布并不能自行旋转,它需要有一个存储图像的缓冲区,而当前的图像将会被复制到该缓冲区中,复制完成后,系统再将其旋转(更新)到画布中。

画布部件的模糊处理

用户可以在画布的指定区域用应用模糊效果,相关的设置函数如下:

在上述的两个函数中,第二个入口参数代表坐标值,第三个入口参数代表模糊区域的半径。

画布部件的 API 函数

LVGL 官方提供了一些与画布部件相关 API,如下表所示:

再来看下guider里面的画布使用

添加一个画布

发现设置中啥都没有,说好的能画矩形能画圆弧这些东西呢?

网上查找,竟然也几乎没有画布使用的资料。

这样来看,这个画布也没啥卵用呀。我花在画布上,和直接画在屏幕上,貌似没啥区别。

那难道稍微复杂些的形状就只能导入图片来实现了?

所能用的图形就只能按照lvgl既定的组件来。

可见,使用插件还是有一些局限性的,只能按照第三方库的样式来绘制。

几个绘制技巧

圆形可以通过按钮矩形增加圆角来实现

注意,LED部件其实也可以绘制圆形。

简单的三角形可以通过直线连接,然后增加线条宽度来实现。

不过,只能勉强适用于一些简单的填充图形。

理论上,任何由线条构成的图形都能画出来。

经过上述过程:

可以这么说,只要不是lvgl自带的图形,都可以使用图片来导入,前提是,前期硬件设计时要考虑好内存以及flash空间的问题。

如果flash不够,而且难以扩展,就可以使用上面说的绘画技巧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day35 ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

● 860.柠檬水找零 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:fiveten0for bill in bills:if bill5:five1elif bill10:five-1ten1elif bill20 and ten!0:five-1ten-1else:five-3if five<0:return Falsereturn True ● 406.根据身高重建队列 cl…

SpringBoot3的RabbitMQ消息服务

目录 预备工作和配置 1.发送消息 实现类 控制层 效果 2.收消息 3.异步读取 效果 4.Work queues --工作队列模式 创建队列text2 实体类 效果 5.Subscribe--发布订阅模式 效果 6.Routing--路由模式 效果 7.Topics--通配符模式 效果 异步处理、应用解耦、流量削…

javascript基础练习题之渔夫捕鱼

一、题目要求&#xff1a;根据用户输入的年、月、日判断是打鱼还是晒网。代码中使用了isLeapYear函数来判断输入的年份是否为闰年&#xff0c;getDays函数来计算输入日期是一年中的第几天&#xff0c;然后根据计算结果来确定是打鱼还是晒网。最后代码通过弹窗提示用户是打鱼还是…

Kimi和ChatGPT做古诗词阅读理解,谁更胜一筹?

前几天发过一篇Kimi整理会议的体验教程&#xff0c;没想到大家很感兴趣&#xff0c;这次再来拿Kimi做古诗词阅读理解看看&#xff0c;同时也对比下ChatGPT的效果。 ChatGPT是几乎家喻户晓的AI大模型&#xff0c;Kimi和它对比有哪些异同点呢&#xff1f; 首先它们都是基于对话…

黑群晖Docker安装aria2-pro

前言 最近买了星际蜗牛C款当Nas&#xff0c;来满足我的存储需求&#xff0c;在之前我写过一篇docker安装aria2-pro的文章&#xff0c;既然买了nas那当然也要安装一个aria2-pro做下载器 1.安装 Container Manager 套件 可以在套件中心搜索docker找到 2.下载aria2-pro镜像 打…

欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 欧拉函数 欧拉函数&#xff08;Eulers totient function&#xff09;是一个与正整数n相关的数论函数&#xff0c;通常用φ(n)表示。定义为小于或等于n的正整数中与n互质的数的个数 int phi(int x) {int res x;for…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

找图识字模拟键鼠编程插件奥迦插件24.3.18

名称&#xff1a;奥迦插件24.3.18更新记录24.3.183 1.增加函数SetObjectNamesEncode2.修复按键函数在有些窗口不能按下方向键的问题命令功能介绍:奥迦插件在Windows 10操作系统上使用Visual Studio 2019编写,适用于所有较新的Windows平台,是一款集网络验证,深度学习,内核,视觉,…

出席2024亚太内容分发大会,火山引擎边缘云“加速”游戏体验升级

3月26日&#xff0c;第十四届亚太内容分发大会暨CDN峰会在北京成功举办&#xff0c;火山引擎边缘云产品架构高级总监许思安出席并以《火山引擎边缘云游戏行业解决方案&#xff0c;“加速”游戏体验升级》为主题&#xff0c;分享了火山引擎边缘云在游戏行业的思考和实践。同时&a…

01使用调试工具

文章目录 前言一、用openocd打开单片机二、利用4444端口向单片机写入hex文件三、利用3333端口和gdb进行调试四、之前我出的问题总结 前言 之前写了一篇关于在linux下搭建stm32标准库的文章后&#xff0c;有一些小伙伴们还是出现了一些奇奇怪怪的错误&#xff0c;这一篇文章就是…

多渠道整合策略全攻略:HubSpot出海CRM助力企业轻松获客

在全球化日益加速的今天&#xff0c;企业纷纷寻求出海机会&#xff0c;以拓展市场、增加客户基础。在这个过程中&#xff0c;一个强大的客户关系管理系统&#xff08;CRM&#xff09;显得尤为关键。作为业内领先的CRM解决方案提供商&#xff0c;HubSpot出海CRM以其强大的核心功…

5.1 物联网RK3399项目开发实录-Android开发之ADB使用(wulianjishu666)

物联网项目开发实例&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11VQMhHfIL9mZhNlls4wmjw?pwd0gfa 1. ADB 使用 1.1. 前言 ADB&#xff0c;全称 Android Debug Bridge&#xff0c;是 Android 的命令行调试工具&#xff0c;可以完成多种功能&#xff0c;如跟踪系…

flutter Got socket error trying to find package nested at

flutter Got socket error trying to find package nested at xxx 报错信息&#xff1a;“Got socket error trying to find package nested at” 通常出现在Flutter尝试从pub.dev获取依赖包时&#xff0c;由于网络问题导致无法连接到pub.dev或者无法正确解析包的路径。 例如&…

LIS、LCS算法模型

文章目录 1.LCS算法模型2.LIS算法模型 1.LCS算法模型 LCS问题就是给定两个序列A和B&#xff0c;求他们最长的公共子序列。 在求解时&#xff0c;我们会设dp[i][j]表示为A[1 ~ i]序列和B[1 ~ j]序列中&#xff08;不规定结尾&#xff09;的最长子序列的长度。 if(a[i]b[i]) dp…

【算法刷题 | 二叉树 04】3.27(翻转二叉树、对称二叉树、完全二叉树的节点个数、平衡二叉树、完全二叉树的所有路径)

文章目录 6.翻转二叉树6.1问题6.2解法一&#xff1a;递归6.2.1递归思路&#xff08;1&#xff09;确定递归函数的参数和返回值&#xff08;2&#xff09;确定终止条件&#xff08;3&#xff09;确定单层递归的逻辑 6.2.2全部代码 6.3解法二&#xff1a;层序遍历 7.对称二叉树7.…

SQLynx发布3.0.0版本:带来更流畅便捷的SQL开发体验

作为新一代的一站式数据库管理开发工具&#xff0c; SQLynx自发布上线以来&#xff0c;一直受到广大用户的好评与鼓励。 为了给用户提供更高效、更便捷、更可靠的数据库管理开发体验&#xff0c;SQLynx今日正式发布3.0.0版本&#xff0c;同步在麦聪软件官网上线&#xff0c;全…

k8s入门到实战(十四)—— Helm详细介绍及使用

Helm 使用 Helm 是一个 k8s 应用的包管理工具&#xff0c;类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。 Helm 使用 chart 来封装 k8s 应用的 yaml 文件&#xff0c;我们只需要设置自己的参数&#xff0c;就可以实现自动化的快速部署应用。 Helm 通过打包的方式&#xff0c;支…

常用的AD规则设置

目录 规则编辑器&#xff1a; 间距规则&#xff1a; 线宽规则&#xff1a; 过孔规则&#xff1a; 铺铜设置&#xff1a; 生成制造过孔&#xff1a; 过孔之间间距&#xff1a; 最小阻焊层间距&#xff1a; 丝印到阻焊的距离&#xff1a; 丝印到丝印距离&#xff1a; 走…

mysql 高阶语句 与视图

目录 一 前言 二 msql 高阶语句使用方法 &#xff08;一&#xff09; 查询并排序&#xff08;order by&#xff09; 1&#xff0c;排序方式 2&#xff0c;查询指定列 并排序 3, 条件判断&#xff08;过滤指定行&#xff09; 再查询指定列 并排序 4&#xff0c;查…

Android Viewpager 内外间距

Android使用Viewpager_内外边距 代码&#xff1a; 1、adapter&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_par…