lvgl小部件使用demo示例说明2

本文详细介绍了LVGL图形库的使用,包括画布的创建、设置缓冲区、填充颜色等操作,图像控件的创建、旋转及抗锯齿设置,以及水平、垂直布局和网格布局的实现。通过示例代码展示了如何在LVGL中绘制图形、添加图像和组织界面元素,帮助开发者更好地理解和应用LVGL进行图形界面设计。
摘要由CSDN通过智能技术生成

简介

本文继续延续上文未完成的lvgl,使用实例说明。

lvgl 画布使用介绍

常用API说明

//画布创建
lv_canvas_create(lv_obj_t * parent);

//给画布设置BUFF
lv_canvas_set_buffer(lv_obj_t * obj, void * buf, lv_coord_t w, lv_coord_t h, lv_img_cf_t cf);

//画板初始化
lv_canvas_set_palette(lv_obj_t * obj, uint8_t id, lv_color_t c);

//用画板为画布填充颜色
lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color, lv_opa_t opa);

//在指定X,Y区域填充指定画板颜色
lv_canvas_set_px(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_color_t c);

//转换图像放置到画布上
void lv_canvas_transform(lv_obj_t *canvas, lv_img_dsc_t *img, int16_t angle, uint16_t zoom, lv_coord_t offset_x, lv_coord_t offset_y, int32_t pivot_x, int32_t pivot_y, bool antialias);

//在画布上画一个矩形
void lv_canvas_draw_rect(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, const lv_draw_rect_dsc_t *draw_dsc);

//在画布上画一个文本
void lv_canvas_draw_text(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, lv_coord_t max_w, lv_draw_label_dsc_t *draw_dsc, const char *txt);

//在画布上画一个图像
void lv_canvas_draw_img(lv_obj_t *canvas, lv_coord_t x, lv_coord_t y, const void *src, const lv_draw_img_dsc_t *draw_dsc);

//在画布上画一条线
void lv_canvas_draw_line(lv_obj_t *canvas, const lv_point_t points[], uint32_t point_cnt, const lv_draw_line_dsc_t *draw_dsc);

//在画布上画一个多边形
void lv_canvas_draw_polygon(lv_obj_t *canvas, const lv_point_t points[], uint32_t point_cnt, const lv_draw_rect_dsc_t *draw_dsc);

示例举例

#define CANVAS_WIDTH  50
#define CANVAS_HEIGHT  50
/*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 palette*/
lv_obj_t * canvas = lv_canvas_create(lv_scr_act());
lv_canvas_set_buffer(canvas, cbuf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_IMG_CF_INDEXED_1BIT);
lv_canvas_set_palette(canvas, 0, lv_palette_main(LV_PALETTE_YELLOW));
lv_canvas_set_palette(canvas, 1, lv_palette_main(LV_PALETTE_BLUE));

/*Create colors with the indices of the palette*/
lv_color_t c1;
lv_color_t c0;

c1.full = 1;
c0.full = 0;

/*Red background (There is no dedicated alpha channel in indexed images so LV_OPA_COVER is ignored)*/
lv_canvas_fill_bg(canvas, c1, LV_OPA_COVER);

/*Create hole on the canvas*/
uint32_t x;
uint32_t y;
for( y = 0; y < 25; y++) 
{
    for( x = 0; x < 25; x++) 
    {
        lv_canvas_set_px(canvas, x, y, c0);
    }
}

使用效果如下

在这里插入图片描述

lvgl image控件使用说明

常用API介绍

//创建image小部件
lv_obj_t * lv_img_create(lv_obj_t * parent)//为显示对象设置图像数据
void lv_img_set_src(lv_obj_t * obj, const void * src);

//为图像设置X方向偏移
void lv_img_set_offset_x(lv_obj_t *obj, lv_coord_t x);

//为图像设置Y方向偏移
void lv_img_set_offset_y(lv_obj_t *obj, lv_coord_t y);

//图像旋转指定角度
void lv_img_set_angle(lv_obj_t *obj, int16_t angle);

//图片抗锯齿使能设置
void lv_img_set_antialias(lv_obj_t *obj, bool antialias);

使用举例

LV_IMG_DECLARE(img_cogwheel_argb);
lv_obj_t * img1 = lv_img_create(lv_scr_act());
lv_img_set_src(img1, &img_cogwheel_argb);
lv_obj_align(img1, LV_ALIGN_CENTER, 0, -20);
lv_obj_set_size(img1, 200, 200);

使用效果如下

在这里插入图片描述

LVGL 布局介绍

水平、垂直布局

常用API

//创建基础对象
lv_obj_create(lv_scr_act());

// 设置对象使用基于行的流失弹性布局flex
lv_obj_set_flex_flow(cont_row, LV_FLEX_FLOW_ROW); 

// 设置对象使用基于列的流失弹性布局flex
lv_obj_set_flex_flow(cont_col, LV_FLEX_FLOW_COLUMN);

//在创建小部件对象的时候加入布局设置,使其在指定布局中
lv_btn_create(cont_row);

使用举例1

/*创建一个具有水平伸缩方向的容器*/
lv_obj_t * cont_row = lv_obj_create(lv_scr_act()); //创建基础对象
lv_obj_set_size(cont_row, 300, 75); //设置容器大小
lv_obj_align(cont_row, LV_ALIGN_TOP_MID, 0, 5); //设置对齐方式(屏幕中间顶部对齐)
lv_obj_set_flex_flow(cont_row, LV_FLEX_FLOW_ROW); // 设置对象使用基于行的流失弹性布局flex

/*创建一个具有垂直伸缩方向的容器*/
lv_obj_t * cont_col = lv_obj_create(lv_scr_act()); //创建基础对象
lv_obj_set_size(cont_col, 200, 150); //设置容器大小
lv_obj_align_to(cont_col, cont_row, LV_ALIGN_OUT_BOTTOM_MID, 0, 5); //设置对齐方式(列布局在行布局外面下方中央-即外部下方中间对齐)
lv_obj_set_flex_flow(cont_col, LV_FLEX_FLOW_COLUMN);  // 设置对象使用基于列的流失弹性布局flex

uint32_t i;
for(i = 0; i < 10; i++) 
{
   lv_obj_t * obj;
   lv_obj_t * label;

   /*Add items to the row*/
   obj= lv_btn_create(cont_row); //把创建的按键添加到水平布局
   lv_obj_set_size(obj, 100, LV_PCT(100));

   label = lv_label_create(obj);
   lv_label_set_text_fmt(label, "Item: %u", i); //设置按键名
   lv_obj_center(label);

   /*Add items to the column*/
   obj = lv_btn_create(cont_col); //把创建的按键添加到垂直布局
   lv_obj_set_size(obj, LV_PCT(100), LV_SIZE_CONTENT);

   label = lv_label_create(obj);
   lv_label_set_text_fmt(label, "Item: %u", i); //设置按键名
   lv_obj_center(label);
}

使用效果如下

在这里插入图片描述

使用举例2

往水平布局中加入其它布局,例如:
lv_obj_t * cont = lv_obj_create(lv_scr_act());
lv_obj_set_size(cont, 300, 220);
lv_obj_center(cont);
lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_ROW);

lv_obj_t * obj;
obj = lv_obj_create(cont);
lv_obj_set_size(obj, 40, 40);           /*Fix size*/

obj = lv_obj_create(cont);
lv_obj_set_height(obj, 40);
lv_obj_set_flex_grow(obj, 1);           /*1 portion from the free space*/

obj = lv_obj_create(cont);
lv_obj_set_height(obj, 40);
lv_obj_set_flex_grow(obj, 2);           /*2 portion from the free space*/

obj = lv_obj_create(cont);
lv_obj_set_size(obj, 40, 40);           /*Fix size. It is flushed to the right by the "grow" items*/

使用效果如下

在这里插入图片描述

网格布局

常用API:

//创建对象
lv_obj_t * cont = lv_obj_create(lv_scr_act()); 
//将对象设置为网格布局
lv_obj_set_layout(cont, LV_LAYOUT_GRID);

//设置网格布局列宽
void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const lv_coord_t value[], lv_style_selector_t selector);

//设置网格布局行高
void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const lv_coord_t value[], lv_style_selector_t selector);

使用示例

//定义3列,每列的列宽为70,LV_GRID_TEMPLATE_LAST作为结束符
static lv_coord_t col_dsc[] = {70, 70, 70, LV_GRID_TEMPLATE_LAST};
//定义3行,每行的行高为50,LV_GRID_TEMPLATE_LAST作为结束符
static lv_coord_t row_dsc[] = {50, 50, 50, LV_GRID_TEMPLATE_LAST};



/*Create a container with grid*/
lv_obj_t * cont = lv_obj_create(lv_scr_act());
lv_obj_set_style_grid_column_dsc_array(cont, col_dsc, 0); //设置网格布局列宽
lv_obj_set_style_grid_row_dsc_array(cont, row_dsc, 0); //设置网格布局行高
lv_obj_set_size(cont, 300, 220); //设置布局大小
lv_obj_center(cont);
lv_obj_set_layout(cont, LV_LAYOUT_GRID); //设置为网格布局

lv_obj_t * label;
lv_obj_t * obj;

uint32_t i;
for(i = 0; i < 9; i++) 
{
   uint8_t col = i % 3;
   uint8_t row = i / 3;

   obj = lv_btn_create(cont);
   /*Stretch the cell horizontally and vertically too
    *Set span to 1 to make the cell 1 column/row sized*/
   lv_obj_set_grid_cell(obj, LV_GRID_ALIGN_STRETCH, col, 1,
                             LV_GRID_ALIGN_STRETCH, row, 1);

   label = lv_label_create(obj);
   lv_label_set_text_fmt(label, "c%d, r%d", col, row);
   lv_obj_center(label);
}

使用效果如下所示:
在这里插入图片描述

好的,以下是使用lvgl实现的示例代码,用于在屏幕恢复亮起来时自动刷新屏幕: ```c #include <lvgl/lvgl.h> // 定义屏幕数据和哈希值 static uint32_t data_hash = 0; static uint32_t screen_data = 0; // 用于检查数据是否已经更新过 static bool data_updated = false; // 定义一个定时器,用于定时检查数据是否已经更新过 static lv_timer_t *timer; // 回调函数,用于更新屏幕数据 static void update_screen_data(void) { // 更新屏幕数据 screen_data = /* 获取最新的屏幕数据 */; // 计算哈希值 data_hash = /* 计算哈希值 */; // 标记数据已经更新过 data_updated = true; } // 回调函数,用于检查数据是否已经更新过 static void check_data_updated(lv_timer_t *timer) { // 如果数据已经更新过,则刷新屏幕 if (data_updated) { lv_disp_flush_ready(NULL); data_updated = false; } } // 回调函数,用于在屏幕恢复亮起来时检查数据是否已经更新过 static void on_screen_wake_up(lv_disp_t *disp) { // 检查数据是否已经更新过 if (data_hash != /* 获取当前屏幕数据的哈希值 */) { lv_disp_flush_ready(disp); return; } // 如果数据没有更新过,启动定时器定时检查 lv_timer_set_repeat(timer, 1000); lv_timer_set_cb(timer, check_data_updated); lv_timer_start(timer); } int main(void) { // 初始化LVGL lv_init(); // 创建一个窗口 lv_obj_t *win = lv_win_create(lv_scr_act(), NULL); lv_win_set_title(win, "Demo"); // 创建一个按钮 lv_obj_t *btn = lv_btn_create(win, NULL); lv_obj_set_size(btn, 100, 50); lv_obj_align(btn, NULL, LV_ALIGN_CENTER, 0, 0); lv_obj_t *label = lv_label_create(btn, NULL); lv_label_set_text(label, "Click me"); // 注册屏幕唤醒回调函数 lv_disp_set_wakeup_hook(lv_disp_get_default(), on_screen_wake_up); // 创建定时器 timer = lv_timer_create(check_data_updated, 1000, NULL); // 更新屏幕数据 update_screen_data(); // 进入主循环 while (1) { lv_task_handler(); /* 其他任务处理 */ } return 0; } ``` 在这个示例中,我们定义了一个`data_updated`标志,用于标记数据是否已经更新过。在数据更新时,我们将`data_updated`标志设置为`true`,并计算数据的哈希值。在屏幕恢复亮起来时,我们首先检查数据的哈希值是否一致,如果不一致,直接刷新屏幕。如果数据的哈希值一致,就启动一个定时器,定时检查`data_updated`标志是否为`true`,如果为`true`,就刷新屏幕。如果`data_updated`标志为`false`,就不刷新屏幕。这样,即使屏幕上没有新的数据需要刷新,也能够自动刷新屏幕以确保显示的数据是最新的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值