lvgl V7 lv_canvas_flush函数实现
时间: 2023-08-01 13:10:05 浏览: 86
在 LVGL V7 中,Canvas 的刷新方式与 V6 有所不同,需要使用 `lv_canvas_flush()` 函数刷新 Canvas。下面是 `lv_canvas_flush()` 函数的实现方法:
```c
void lv_canvas_flush(lv_obj_t * canvas, lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2)
{
lv_canvas_buf_t * canvas_buf = (lv_canvas_buf_t *)canvas->spec_attr; // 获取 Canvas 缓存指针
lv_disp_t * disp = lv_obj_get_disp(canvas); // 获取显示设备指针
if(canvas_buf && disp) {
lv_disp_drv_t * disp_drv = disp->driver;
lv_area_t area;
area.x1 = x1;
area.y1 = y1;
area.x2 = x2;
area.y2 = y2;
lv_disp_flush_ready(&disp_drv->flush_ready);
disp_drv->flush_cb(disp_drv, canvas_buf->buf_act, &area, canvas_buf->width, canvas_buf->height);
lv_disp_flush_ready(&disp_drv->flush_ready);
}
}
```
`lv_canvas_flush()` 函数的参数包括 Canvas 对象、需要更新的区域的坐标以及显示设备的指针。函数内部先获取 Canvas 的缓存指针和显示设备指针,然后使用 lv_disp_drv_t 结构体中的 flush_cb 回调函数进行刷新。在刷新之前,需要调用 `lv_disp_flush_ready()` 函数,通知显示设备准备刷新。刷新完成后,再次调用 `lv_disp_flush_ready()` 函数,通知显示设备刷新完成。
需要注意的是,在使用 `lv_canvas_flush()` 函数时,需要传入一个 `lv_area_t` 类型的结构体参数,指定需要刷新的区域。如果需要在整个画布上进行刷新,可以传入 Canvas 对象的宽度和高度作为参数。