LVGL之line
1.前期准备
通过设置点来绘制线段,同一个集合中的点都会被连起来。
线条颜色可以通过十六进制(HEX)设置
lv_style_set_line_color(&lineStyle2, lv_color_hex(0x00FF00));
先绘制背景,在背景上绘制线段,再通过线颜色确定板子的颜色格式
lvgl自带就有一个白色的背景,等于说lv_scr_act()
就是白色全屏幕背景,不知道这个是lvgl自带还是显示驱动移植是设置的。
绘制背景加线段时会报错,堆栈溢出,不知道哪里设置错了。
#if whiteBackGround
lv_obj_t *whiteBG = lv_obj_create(lv_scr_act());
lv_obj_set_size(whiteBG, LV_HOR_RES, LV_VER_RES);
lv_obj_align(whiteBG, LV_ALIGN_TOP_LEFT, 0, 0);
lv_obj_set_style_bg_color(whiteBG, lv_color_hex(0xFFFFFFFF), 0);
lv_obj_set_style_border_color(whiteBG, lv_color_hex(0xFFFFFFFF), 0);
#endif
#if line
lv_point_t canvasPoints1[] = {{0, 0}, {100, 100}};
lv_point_t canvasPoints2[] = {{0,0}, {0, 1280}};
lv_style_t lineStyle;
lv_style_init(&lineStyle);
lv_style_set_line_color(&lineStyle, lv_color_hex(0x00FF00FF));
lv_style_set_line_width(&lineStyle, 5);
lv_style_t lineStyle2;
lv_style_init(&lineStyle2);
lv_style_set_line_color(&lineStyle2, lv_color_hex(0xFF00FF00));
lv_style_set_line_width(&lineStyle2, 5);
lv_obj_t *line1 = lv_obj_create(whiteBG);
lv_line_set_points(line1, canvasPoints1, 2);
lv_obj_add_style(line1, &lineStyle, 0);
/*lv_obj_t *line2 = lv_obj_create(whiteBG);
lv_line_set_points(line2, canvasPoints2, 2);
lv_obj_add_style(line2, &lineStyle2, 0);*/
#endif
测试出来,不是背景问题,是绘制线段时报错
lv_point_t canvasPoints1[] = {{0, 0}, {70, 0}};
lv_style_t lineStyle;
lv_style_init(&lineStyle);
lv_style_set_line_color(&lineStyle, lv_color_hex(0xFF0000));
lv_style_set_line_width(&lineStyle, 5);
lv_obj_t* line1 = lv_obj_create(lv_scr_act());
lv_line_set_points(line1, canvasPoints1, 2);
lv_obj_add_style(line1, &lineStyle, 0);
错误很简单,应该用lv_line_create
而不是lv_obj_create
。
测试出来板子颜色格式应该是BGR,
stytle应该是全局的,有border跟pad,outline
2.批量绘制线段
在绘制未知数量的线段时,不应用静态数组,而是动态申请空间以存储点信息
int canvasLinesNum = getCanvasLinesNum();
lv_point_t *canvasPoints[canvasLinesNum];
lv_obj_t *lines[canvasLinesNum];
for(int i = 1; i <= canvasLinesNum; i++){
canvasPoints[i - 1] = lv_mem_alloc(2 * sizeof(lv_point_t));
if (canvasPoints[i - 1] == NULL) {
// 内存分配失败,进行错误处理
printf("lv_mem_alloc failed\n");
continue;
}
canvasPoints[i - 1][0].x = canvasLine.startPoint[0];
canvasPoints[i - 1][0].y = canvasLine.startPoint[1];
canvasPoints[i - 1][1].x = canvasLine.endPoint[0];
canvasPoints[i - 1][1].y = canvasLine.endPoint[1];
printf("canvasPoints: %d,%d, %d,%d\n",
canvasPoints[i - 1][0].x, canvasPoints[i - 1][0].y,
canvasPoints[i - 1][1].x, canvasPoints[i - 1][1].y);
lines[i - 1] = lv_line_create(whiteBG);
lv_line_set_points(lines[i - 1], canvasPoints[i - 1], 2);
lv_obj_add_style(lines[i - 1], &lineStyle, 0);
}
//注意释放
for(int i = 0; i < canvasLinesNum; i++){
lv_mem_free(canvasPoints[i]);
}