LVGL『Canvas画布控件』介绍_lv_canvas_draw_img-程序员宅基地

技术标签: LVGL Canvas  # LVGL GUI  LVGL GUI  嵌入式GUI  LVGL 画布  

一. LVGL GUI画布控件的概念

画布继承自图像,用户可以在其中绘制任何内容。可以使用 lvgl 的绘图引擎在此处绘制矩形,文本,图像,圆弧。除了一些“效果”,还可以应用,例如旋转,缩放和模糊。

二. LVGL GUI画布小部件和样式

画布的主要部分称为 LV_CANVAS_PART_MAIN ,只有 image_recolor 属性用于为LV_IMG_CF_ALPHA_1/2/4/8BIT 图像赋予颜色。

三. LVGL GU画布控件的使用

1. 缓冲(Buffer)

画布需要一个缓冲区来存储绘制的图像。要将缓冲区分配给画布,请使用。静态缓冲区(不能是局部变量)在哪里, 用于保存画布的图像。例如, 。宏有助于确定具有不同颜色格式的缓冲区的大小。

使用的是这个函数lv_canvas_set_buffer(canvas, buffer, width, height, LV_IMG_CF_...)

2. 调色板(Palette)

对于 LV_IMG_CF_INDEXED_... 颜色格式,必须使用初始化调色板 ,使用这个函数lv_canvas_set_palette(canvas, 3, LV_COLOR_RED),将 index = 3 的像素设置为红色

3. 绘画(Drawing)

用这个函数来设置像素点颜色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()

4. 转换(Transformations)

lv_canvas_transform() 可用于旋转和/或缩放图像的图像并将结果存储在画布上。该函数需要以下
参数如下:

  • canvas :指向画布对象以存储转换结果的指针。
  • img pointer :转换为图像描述符。也可以是其他画布的图像描述符( lv_canvas_get_img() )。
  • angle :旋转角度(0..3600),0.1 度分辨率
  • zoom :缩放系数,基数是256,代表原比例(256 不缩放,512 倍大,128 缩小一倍)
  • offset_x :偏移量 X 告诉将结果数据放在目标画布上的位置
  • offset_y :偏移量 X 告诉将结果数据放在目标画布上的位置
  • pivot_x :旋转的 X 轴。相对于源画布。设置为绕中心旋转 source width / 2
  • pivot_y :旋转的枢轴 Y。相对于源画布。设置为绕中心旋转 source height / 2
  • antialias true:在转换过程中应用抗锯齿。看起来更好,但速度较慢。

请注意,画布无法自身旋转。您需要源和目标画布或图像

5. Blur(模糊)

用这个函数可以指定水平模糊lv_canvas_blur_hor(canvas, &area, r)

用这个函数可以指定垂直模糊lv_canvas_blur_ver(canvas, &area, r)

6. 事件(Events)

默认画布是不能点击的,所以没有任何时间,但是可以通过这个函数来使能点击lv_obj_set_click(canvas, true)

7. 源码示例

我们直接来两个官方的例子自己看看效果吧

示例1

#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);
}

效果

示例2

#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);
        }
    }
}

效果:

好了,完结了,更多精彩继续戳↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/113914896

智能推荐

java与mysql8.0连接Jdbc驱动的配置参数_java mysql8连接参数-程序员宅基地

文章浏览阅读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连接参数

C语言“…”占位符及可变参数函数-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏4次。C语言函数的参数传递总是固定了个数,那么有没有传递任意个数参数的方法呢?在C++中,函数重载提供了多种参数传递的解决办法,但也不是任意参数个数。事实上,C语言是提供任意数量参数的解决方案的。printf(),scanf()等就是这样一类可支持任意参数个数变量的函数,以下是printf的用法示例。1printf("%d",x);..._scanf_s 占位符和其参数预计 1 可变参数

Simplygon软件之SimplygonUI 编辑器界面-程序员宅基地

文章浏览阅读2.8k次。Simplygon UISimplygonUI 默认布局Simplygon 安装完成后,可以双击快捷图标启动软件,软件启动后需要登入,登陆方式有两种1.Grid:在安装有 Simplygon Grid Server 功能的其他本地服务器上处理工作选择 Grid 选项卡输入 登陆凭证 和 服务器 IP 地址进行登陆,用户管理和凭证通过 Simplygon Grid管理实用程序进行管理 Si..._simplygon

如何写出高转化率文案_如何写出高转化率文案 pdf-程序员宅基地

文章浏览阅读465次。解剖1个案例,解锁8种文案写法! 1、以小写大。 关键在于有多大?只小不大无价值,只大不小无效果。 照顾树木、工人违规、修改设计是小事,却放大了土地价值:别墅的核心价值。 2、以具象写抽象。 以小写大,就是以细节写整体,也是以具象写抽象。 稀缺、珍惜、用心是抽象概念,直接写出来是瞎吆喝,要通过具象的行为和过程,让消费者感受到。 为保护这片原生林,开发商自掏腰包养了一个护林队,这才是消费者可以感受到的珍惜和用心。 3、以形象写具象 只具象,不够,还要形象。 人是通过形象来记忆、来联想的。 这几个标题和内文是具_如何写出高转化率文案 pdf

spring boot mybatis-generator 使用tk.mybatis.mapper通用mapper自动生成代码_tk.mybatis.mapper.generator.mapperplugin-程序员宅基地

文章浏览阅读1.3w次,点赞2次,收藏17次。前言这次的项目,使用spring boot 多模块开发。其中,数据库集成了data Jpa 和 Mybatis。最先引入的data jpa,但是后面涉及到多表关联多条件查询的时候,就显得很麻烦。然后就把mybatis也引入了进来。这里重点记录一下如何使用通用mapper逆向生成代码。提高我们的工作效率。环境开发工具:IntelliJ IDEA 2018项目框架: 基于Spring B..._tk.mybatis.mapper.generator.mapperplugin

量化投资之工具篇一:Backtrader从入门到精通(7)-Indicator类源代码解读(2)_dst[i] = math.fsum(src[i - period + 1:i + 1]) / pe-程序员宅基地

文章浏览阅读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

随便推点

clickhouse(十二、踩坑之路)_attempt to read after eof: cannot parse int32 from-程序员宅基地

文章浏览阅读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

python基础教程-数字与表达式——浮点数_python表达浮点数的两种方式-程序员宅基地

文章浏览阅读621次。1、python的加减乘数与计算机的加减乘除几乎差不多 + - * /2、如果参数除法中有一个为浮点数结果 亦为浮点数 >>> 1.0 / 2.0 0.5 >>> 1/2.0 0.53 、 双斜线 // 实现整除的操作符 >>> 1.0 // 2.0 0.0 >>> 1 // _python表达浮点数的两种方式

西瓜书《机器学习》课后答案——Chapter6_6.3_实验二、自主选择两个uci数据集,分别用高斯核训练svm分类器以及bp神经网络进行分-程序员宅基地

文章浏览阅读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神经网络进行分

HBase-2.4.6安装教程 附常见错误解决_hbase2.4.6-程序员宅基地

文章浏览阅读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日 合同编号: 技术开发(委托)合同 项目名称:用简明、准确的文字表达合同的标的和名称 委托方(甲方):用《企业法人营业执照》规定的法定名称 (买方)_本合同履行完毕后,上述技术资料按以下方式处理

Exynos4412异步串口通信及实验_异步串行通信方式数据值怎么求-程序员宅基地

文章浏览阅读3.7k次,点赞2次,收藏12次。通信传输方式串行通信(二进制) 串行传送,数据是按顺序一位一位传送,一条数据线或差分线传输并行通信 数据各位同时传送,多条数据线比较:串行通常传输速度比较慢,成本低,适用于计算机间的远距离传输。并行传输速率高,成本也高,适用于近距离设备传输,当然了还有RS-485,RS-422,使用了串行差分通信总线,传输速率快,抗干扰性能好,同时传输距离远。同步传输与异步传输_异步串行通信方式数据值怎么求

推荐文章

热门文章

相关标签