LVGL V7中LV_COLOR_MAKE颜色值对不上,怎么解决
时间: 2024-02-21 09:00:59 浏览: 182
LV_COLOR_MAKE是用来创建颜色值的宏定义,其参数应该是RGB三色的值。在LVGL V7中,LV_COLOR_MAKE的参数顺序发生了变化,由原来的(R,G,B)变成了(B,G,R)。所以如果你使用了老版本的代码,在新版本中可能会出现颜色对不上的问题。
解决方法是在使用LV_COLOR_MAKE时,将RGB三色的值按照新的顺序(B,G,R)传入。例如,如果要创建红色,以前的代码可能是这样的:
```
lv_color_t red = LV_COLOR_MAKE(255, 0, 0);
```
在LVGL V7中,应该改成这样:
```
lv_color_t red = LV_COLOR_MAKE(0, 0, 255);
```
这样就能正确创建红色了。如果你的代码中有大量使用LV_COLOR_MAKE的地方,可以考虑写一个宏定义来自动调整参数顺序,以免手动修改太麻烦。
相关问题
lvgl V7中lv_canvas_clean函数实现
在LVGL V7中,`lv_canvas_clean()`函数的实现如下所示:
```c
void lv_canvas_clean(lv_obj_t * canvas)
{
LV_ASSERT_OBJ(canvas, LV_OBJX_NAME);
lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas);
if(ext->dsc.header.always_zero == 0) return;
lv_color_t color = lv_color_hex(ext->dsc.header.color);
lv_disp_t * disp = lv_obj_get_disp(canvas);
lv_disp_buf_t * draw_buf = lv_disp_get_draw_buf(disp);
uint32_t w = lv_obj_get_width(canvas);
uint32_t h = lv_obj_get_height(canvas);
uint32_t x = lv_obj_get_x(canvas);
uint32_t y = lv_obj_get_y(canvas);
if(ext->clip_area.width != 0 && ext->clip_area.height != 0) {
lv_area_t rel_area;
lv_obj_get_coords(canvas, &rel_area);
lv_area_intersect(&rel_area, &ext->clip_area, &rel_area);
if(lv_area_get_width(&rel_area) == 0 || lv_area_get_height(&rel_area) == 0) return;
lv_area_t abs_area;
lv_obj_get_abs_coords(canvas, &abs_area);
lv_disp_drv_t * drv = lv_disp_get_drv(disp);
uint32_t y1 = abs_area.y1 + rel_area.y1;
uint32_t x1 = abs_area.x1 + rel_area.x1;
uint32_t len = lv_area_get_width(&rel_area);
uint32_t px_offset = (y1 * draw_buf->w + x1);
for(uint32_t i = 0; i < lv_area_get_height(&rel_area); i++) {
lv_disp_flush_dsc_t flush_dsc;
lv_disp_flush_dsc_init(&flush_dsc);
flush_dsc.area.x1 = x1;
flush_dsc.area.x2 = x1 + len - 1;
flush_dsc.area.y1 = y1 + i;
flush_dsc.area.y2 = y1 + i;
lv_disp_flush_drv_t flush_drv;
lv_disp_flush_drv_init(&flush_drv);
flush_drv.draw_buf = draw_buf;
flush_drv.flush_cb = drv->flush_cb;
flush_drv.user_data = drv->user_data;
flush_drv.wait_cb = drv->wait_cb;
flush_drv.monitor_cb = drv->monitor_cb;
flush_drv.hor_res = drv->hor_res;
flush_drv.ver_res = drv->ver_res;
/* Fill the line */
lv_memset_00(&draw_buf->buf_act[px_offset], len * sizeof(lv_color_t));
lv_disp_flush(&flush_drv, &flush_dsc);
}
} else {
lv_disp_fill(&color, NULL, w * h, x, y);
}
}
```
该函数主要有以下几个步骤:
1. 获取canvas控件对象的扩展属性`ext`。
2. 判断`ext->dsc.header.always_zero`是否为0。如果为0,表示该canvas是不透明的,已经被完全覆盖,无需再次清空。如果不为0,则需要进行清空操作。
3. 获取canvas的宽度`w`、高度`h`、x坐标`x`和y坐标`y`。
4. 如果canvas有剪切区域,则获取剪切区域的相对位置和绝对位置,并且遍历剪切区域的每一行,将该行的像素点设置为背景色。
5. 如果canvas没有剪切区域,则直接使用`lv_disp_fill()`函数进行填充。
总的来说,`lv_canvas_clean()`函数的实现比较简单,主要是对canvas的背景色进行填充,以达到清空canvas的效果。
LVGL V7,lv_canvas绘制圆弧示例
好的,以下是使用 LVGL V7 中的 `lv_canvas` 绘制圆弧的示例代码:
```c
// 创建一个画布对象
lv_obj_t *canvas = lv_canvas_create(lv_scr_act(), NULL);
lv_canvas_set_buffer(canvas, buf, CANVAS_WIDTH, CANVAS_HEIGHT, LV_IMG_CF_TRUE_COLOR);
// 设置画布属性
lv_canvas_set_bg_color(canvas, LV_COLOR_WHITE);
lv_canvas_fill_bg(canvas, LV_COLOR_WHITE, LV_OPA_COVER);
lv_canvas_set_draw_color(canvas, LV_COLOR_RED);
// 绘制圆弧
lv_arc_draw_bg_t arc_draw_bg;
lv_arc_init_draw_bg(&arc_draw_bg);
arc_draw_bg.line_width = 10;
arc_draw_bg.color = LV_COLOR_RED;
arc_draw_bg.bg_color = LV_COLOR_WHITE;
lv_canvas_draw_arc(canvas, 50, 50, 30, 0, 180, &arc_draw_bg);
```
其中,`buf` 是画布的缓存,`CANVAS_WIDTH` 和 `CANVAS_HEIGHT` 是画布的宽度和高度。在设置画布属性时,我们设置了背景色为白色,并用白色填充整个画布。然后,我们将绘图颜色设置为红色,并使用 `lv_canvas_draw_arc` 函数绘制了一个半径为 30 像素、圆心坐标为 (50, 50)、起始角度为 0 度、终止角度为 180 度的圆弧,线宽为 10 像素,颜色为红色,背景色为白色。
阅读全文