技术标签: LVGL Canvas # LVGL GUI LVGL GUI 嵌入式GUI LVGL 画布
画布继承自图像,用户可以在其中绘制任何内容。可以使用 lvgl 的绘图引擎在此处绘制矩形,文本,图像,圆弧。除了一些“效果”,还可以应用,例如旋转,缩放和模糊。
画布的主要部分称为 LV_CANVAS_PART_MAIN ,只有 image_recolor 属性用于为LV_IMG_CF_ALPHA_1/2/4/8BIT 图像赋予颜色。
画布需要一个缓冲区来存储绘制的图像。要将缓冲区分配给画布,请使用。静态缓冲区(不能是局部变量)在哪里, 用于保存画布的图像。例如, 。宏有助于确定具有不同颜色格式的缓冲区的大小。
使用的是这个函数lv_canvas_set_buffer(canvas, buffer, width, height, LV_IMG_CF_...)
对于 LV_IMG_CF_INDEXED_... 颜色格式,必须使用初始化调色板 ,使用这个函数lv_canvas_set_palette(canvas, 3, LV_COLOR_RED),将 index = 3 的像素设置为红色
用这个函数来设置像素点颜色lv_canvas_set_px(canvas, x, y, LV_COLOR_RED)
用这个函数来设置背景以及不透明度lv_canvas_fill_bg(canvas, LV_COLOR_BLUE, LV_OPA_50)
用这个函数可以把数组复制到画板像素上lv_canvas_copy_buf(canvas, buffer_to_copy, x, y, width, height)
另外,可以在画板中绘制其他控件,如下:
lv_canvas_draw_rect(canvas, x, y, width, heigth, &draw_dsc)
lv_canvas_draw_text(canvas, x, y, max_width, &draw_dsc, txt, LV_LABEL_ALIGN_LEFT/CENTER/RIGHT)
lv_canvas_draw_img(canvas, x, y, &img_src, &draw_dsc)
lv_canvas_draw_line(canvas, point_array, point_cnt, &draw_dsc)
lv_canvas_draw_polygon(canvas, points_array, point_cnt, &draw_dsc)
lv_canvas_draw_arc(canvas, x, y, radius, start_angle, end_angle, &draw_dsc)
其中draw_dsc需要用这个函数进行初始化lv_draw_rect/label/img/line_dsc_init()
lv_canvas_transform() 可用于旋转和/或缩放图像的图像并将结果存储在画布上。该函数需要以下
参数如下:
请注意,画布无法自身旋转。您需要源和目标画布或图像
用这个函数可以指定水平模糊lv_canvas_blur_hor(canvas, &area, r)
用这个函数可以指定垂直模糊lv_canvas_blur_ver(canvas, &area, r)
默认画布是不能点击的,所以没有任何时间,但是可以通过这个函数来使能点击lv_obj_set_click(canvas, true)
我们直接来两个官方的例子自己看看效果吧
#define CANVAS_WIDTH 200
#define CANVAS_HEIGHT 150
void lvgl_canvas_test1(void)
{
lv_draw_rect_dsc_t rect_dsc;
lv_draw_rect_dsc_init(&rect_dsc);
rect_dsc.radius = 10;
rect_dsc.bg_opa = LV_OPA_COVER;
rect_dsc.bg_grad_dir = LV_GRAD_DIR_HOR;
rect_dsc.bg_color = LV_COLOR_RED;
rect_dsc.bg_grad_color = LV_COLOR_BLUE;
rect_dsc.border_width = 2;
rect_dsc.border_opa = LV_OPA_90;
rect_dsc.border_color = LV_COLOR_WHITE;
rect_dsc.shadow_width = 5;
rect_dsc.shadow_ofs_x = 5;
rect_dsc.shadow_ofs_y = 5;
lv_draw_label_dsc_t label_dsc;
lv_draw_label_dsc_init(&label_dsc);
label_dsc.color = LV_COLOR_YELLOW;
static lv_color_t cbuf[LV_CANVAS_BUF_SIZE_TRUE_COLOR(CANVAS_WIDTH, CANVAS_HEIGHT)];
lv_obj_t* canvas = lv_canvas_create(lv_scr_act(), NULL);
lv_canvas_set_buffer(canvas, cbuf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_IMG_CF_TRUE_COLOR);
lv_obj_align(canvas, NULL, LV_ALIGN_CENTER, 0, 0);
lv_canvas_fill_bg(canvas, LV_COLOR_SILVER, LV_OPA_COVER);
lv_canvas_draw_rect(canvas, 70, 60, 100, 70, &rect_dsc);
lv_canvas_draw_text(canvas, 40, 20, 100, &label_dsc, "Some text on text canvas", LV_LABEL_ALIGN_LEFT);
/* Test the rotation. It requires an other buffer where the orignal image is stored.
* So copy the current image to buffer and rotate it to the canvas */
static lv_color_t cbuf_tmp[CANVAS_WIDTH * CANVAS_HEIGHT];
memcpy(cbuf_tmp, cbuf, sizeof(cbuf_tmp));
lv_img_dsc_t img;
img.data = (void*)cbuf_tmp;
img.header.cf = LV_IMG_CF_TRUE_COLOR;
img.header.w = CANVAS_WIDTH;
img.header.h = CANVAS_HEIGHT;
lv_canvas_fill_bg(canvas, LV_COLOR_SILVER, LV_OPA_COVER);
lv_canvas_transform(canvas, &img, 30, LV_IMG_ZOOM_NONE, 0, 0, CANVAS_WIDTH / 2, CANVAS_HEIGHT / 2, true);
}
效果
#define CANVAS_WIDTH 50
#define CANVAS_HEIGHT 50
void lvgl_canvas_test2(void)
{
/*Create a button to better see the transparency*/
lv_btn_create(lv_scr_act(), NULL);
/*Create a buffer for the canvas*/
static lv_color_t cbuf[LV_CANVAS_BUF_SIZE_INDEXED_1BIT(CANVAS_WIDTH, CANVAS_HEIGHT)];
/*Create a canvas and initialize its the palette*/
lv_obj_t* canvas = lv_canvas_create(lv_scr_act(), NULL);
lv_canvas_set_buffer(canvas, cbuf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_IMG_CF_INDEXED_1BIT);
lv_canvas_set_palette(canvas, 0, LV_COLOR_TRANSP);
lv_canvas_set_palette(canvas, 1, LV_COLOR_RED);
/*Create colors with the indices of the palette*/
lv_color_t c0;
lv_color_t c1;
c0.full = 0;
c1.full = 1;
/*Transparent background*/
lv_canvas_fill_bg(canvas, c1, LV_OPA_TRANSP);
/*Create hole on the canvas*/
uint32_t x;
uint32_t y;
for (y = 10; y < 30; y++) {
for (x = 5; x < 20; x++) {
lv_canvas_set_px(canvas, x, y, c0);
}
}
}
效果:
好了,完结了,更多精彩继续戳↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
文章浏览阅读1k次。备忘记 2java与mysql8.0连接Jdbc驱动的配置参数driver:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/xxx?useUnicode=true&serverTimezone=GMT&characterEncoding=UTF-8&useSSL=false_java mysql8连接参数
文章浏览阅读1.8k次,点赞2次,收藏4次。C语言函数的参数传递总是固定了个数,那么有没有传递任意个数参数的方法呢?在C++中,函数重载提供了多种参数传递的解决办法,但也不是任意参数个数。事实上,C语言是提供任意数量参数的解决方案的。printf(),scanf()等就是这样一类可支持任意参数个数变量的函数,以下是printf的用法示例。1printf("%d",x);..._scanf_s 占位符和其参数预计 1 可变参数
文章浏览阅读2.8k次。Simplygon UISimplygonUI 默认布局Simplygon 安装完成后,可以双击快捷图标启动软件,软件启动后需要登入,登陆方式有两种1.Grid:在安装有 Simplygon Grid Server 功能的其他本地服务器上处理工作选择 Grid 选项卡输入 登陆凭证 和 服务器 IP 地址进行登陆,用户管理和凭证通过 Simplygon Grid管理实用程序进行管理 Si..._simplygon
文章浏览阅读465次。解剖1个案例,解锁8种文案写法! 1、以小写大。 关键在于有多大?只小不大无价值,只大不小无效果。 照顾树木、工人违规、修改设计是小事,却放大了土地价值:别墅的核心价值。 2、以具象写抽象。 以小写大,就是以细节写整体,也是以具象写抽象。 稀缺、珍惜、用心是抽象概念,直接写出来是瞎吆喝,要通过具象的行为和过程,让消费者感受到。 为保护这片原生林,开发商自掏腰包养了一个护林队,这才是消费者可以感受到的珍惜和用心。 3、以形象写具象 只具象,不够,还要形象。 人是通过形象来记忆、来联想的。 这几个标题和内文是具_如何写出高转化率文案 pdf
文章浏览阅读1.3w次,点赞2次,收藏17次。前言这次的项目,使用spring boot 多模块开发。其中,数据库集成了data Jpa 和 Mybatis。最先引入的data jpa,但是后面涉及到多表关联多条件查询的时候,就显得很麻烦。然后就把mybatis也引入了进来。这里重点记录一下如何使用通用mapper逆向生成代码。提高我们的工作效率。环境开发工具:IntelliJ IDEA 2018项目框架: 基于Spring B..._tk.mybatis.mapper.generator.mapperplugin
文章浏览阅读6.4k次,点赞20次,收藏54次。接上一篇继续。系统内置Indicator的介绍Backtrader提供了很多内置的Indicator,了解这些Indicator对我们自定义指标、理解现有指标以及制定策略具有重要作用。基本操作类Backtrader提供了很多基本操作类,作为定义其他指标的基准。先看PeriodN,这个类是所有需要使用周期进行计算指标(例如移动平均)的基类:class PeriodN(Indicator): ''' Base class for indicators which take a per_dst[i] = math.fsum(src[i - period + 1:i + 1]) / period indexerror: array ass
文章浏览阅读2.1w次,点赞11次,收藏36次。Q1DB::Exception: Cannot create table from metadata file /data/clickhouse/metadata/default/dwd_test.sql, error: DB::Exception: The local set of parts of table default.dwd_test doesn’t look like the set of parts in ZooKeeper: 65.88 million rows of 85.04 mi._attempt to read after eof: cannot parse int32 from string, because value is
文章浏览阅读621次。1、python的加减乘数与计算机的加减乘除几乎差不多 + - * /2、如果参数除法中有一个为浮点数结果 亦为浮点数 >>> 1.0 / 2.0 0.5 >>> 1/2.0 0.53 、 双斜线 // 实现整除的操作符 >>> 1.0 // 2.0 0.0 >>> 1 // _python表达浮点数的两种方式
文章浏览阅读8.2k次,点赞5次,收藏45次。6.3 选择两个UCI数据集,分别用线性核和高斯核训练一个SVM,并与BP神经网络和C4.5决策树进行实验比较。 解答: (1) 准备libsvm的训练数据与测试数据从UCI网站上选择了Iris数据集,这个数据集总共分为3类,每类50个样本,每个实例有四个属性。数据保存在bezdekIris.txt文件中,举一个样本为例:5.1,3.5,1.4,0.2,Iris-setosa书中也没有介绍解决多_实验二、自主选择两个uci数据集,分别用高斯核训练svm分类器以及bp神经网络进行分
文章浏览阅读741次。我这里采用了jdk1.8.0_301+hadoop-3.3.1+zookeeper-3.6.3+hbase-2.4.6的版本不同版本可能不能兼容,兼容性问题可以去官网查看http://hbase.apache.org/book.html#_preface我这里有三台虚拟机,hadoop102,hadoop103,hadoop1041、zookeeper正常部署首先保证三台机器的zookeeper正常启动[user@hadoop102 zookeeper-3.6.3]$ bin/zkServer.s_hbase2.4.6
文章浏览阅读6.1k次,点赞4次,收藏7次。技术合同填写说明 所属类别:办事指南 发布时间:2009年6月12日 合同编号: 技术开发(委托)合同 项目名称:用简明、准确的文字表达合同的标的和名称 委托方(甲方):用《企业法人营业执照》规定的法定名称 (买方)_本合同履行完毕后,上述技术资料按以下方式处理
文章浏览阅读3.7k次,点赞2次,收藏12次。通信传输方式串行通信(二进制) 串行传送,数据是按顺序一位一位传送,一条数据线或差分线传输并行通信 数据各位同时传送,多条数据线比较:串行通常传输速度比较慢,成本低,适用于计算机间的远距离传输。并行传输速率高,成本也高,适用于近距离设备传输,当然了还有RS-485,RS-422,使用了串行差分通信总线,传输速率快,抗干扰性能好,同时传输距离远。同步传输与异步传输_异步串行通信方式数据值怎么求