STTCanvas 是内存位图画布,可直接写像素、绘制图形/文字/图片、执行旋转缩放和模糊。它适合自定义仪表、签名板和离屏合成。
#include "widgets/STTCanvas.h"
using namespace stt;
STTCanvas* canvas = new STTCanvas(getRuntime(), parent, "canvasPlot");
canvas->setMainArg(20, 20, 320, 180, 0xffffff, 255, "");
setMainArg 设置位置、尺寸,自动分配真彩色缓冲区并填充背景,img 非空时按原尺寸绘制,不会缩放。
canvas->setBuffer(nullptr, 320, 180, LV_IMG_CF_TRUE_COLOR);
传 nullptr 时,旧的内部 cbuf 会先释放,再用 LV_CANVAS_BUF_SIZE_TRUE_COLOR 分配。注意:即使 cf 传索引色等其他格式,分配大小仍按真彩色宏计算,这是当前实现差异。
static lv_color_t buffer[320 * 180];
canvas->setBuffer(buffer, 320, 180, LV_IMG_CF_TRUE_COLOR);
外部 buf 不会被 STTCanvas 释放,并且必须在画布整个使用期间有效。切换到外部 buf 时,之前的内部 cbuf 不会立即释放,要到下次内部 setBuffer 或析构时释放。
getBuffer 只返回内部 cbuf;使用外部缓冲区时可能返回 nullptr 或旧内部指针,不能用它取得当前外部 buf。getImage 返回底层画布图像描述符,为借用指针。
canvas->setPixelColor(10, 12, 0xff0000);
canvas->setPixelOpa(10, 12, 200);
int color = canvas->getPixelColor(10, 12);
调用方必须保证坐标位于画布内。STTCanvas 不做边界检查。
索引色格式可设置调色板:
canvas->setPalette(0, 0xffffff);
canvas->setPalette(1, 0x000000);
id 范围取决于色彩格式:INDEXED1 为 0..1,INDEXED2 为 0..3,INDEXED4 为 0..15,INDEXED8 为 0..255。
canvas->fillBg(0xffffff, 255);
canvas->drawRect(10, 10, 100, 60);
canvas->drawLine(10, 100, 200, 100);
canvas->drawArc(80, 30, 40, 135, 45);
默认样式:
| API | 默认效果 |
|---|---|
| drawRect | 透明填充、2 px 黑边框 |
| drawText | 黑色、应用默认字体 |
| drawImage | 默认图片描述符 |
| drawLine | 2 px 黑线 |
| drawPolygon | 不透明默认背景 |
| drawArc | 2 px 黑色弧 |
fillBg(LvColor*, opa) 会解引用 color,不能传 nullptr。
LvDrawRectDsc rect;
lv_draw_rect_dsc_init((lv_draw_rect_dsc_t*)&rect);
rect.bg_color = lv_color_hex(0x1687d9);
rect.bg_opa = 255;
canvas->drawRect(20, 20, 120, 60, &rect);
文字:
LvDrawLabelDsc text;
lv_draw_label_dsc_init((lv_draw_label_dsc_t*)&text);
text.color = lv_color_hex(0x222222);
text.font = (lv_font_t*)getRuntime()->getIFntMgr()->getFont("文泉驿微米黑", 18);
canvas->drawText(16, 16, 200, &text, "设备状态");
max_w=0 会被改为 100。txt 必须是有效且以零结尾的字符串。
线和多边形:
LvPoint points[] = {{10, 10}, {100, 20}, {80, 90}};
canvas->drawLine(points, 3);
canvas->drawPolygon(points, 3);
int xy[] = {10, 10, 100, 20, 80, 90};
canvas->drawLine(xy, 3);
canvas->drawPolygon(xy, 3);
数值数组重载使用栈上变长数组,属于 GCC 扩展;point_cnt 必须为正且不宜过大,xy 至少包含 2 × point_cnt 个整数。
canvas->drawImage(0, 0, "res/chart_grid.png");
canvas->setBgImg("res/chart_grid.png");
setBgImg 忽略 part,实际等价于在 (0,0) 调用 drawImage,不是 STTWidget 的背景样式。图片超出画布会被裁剪,且不会自动缩放。
整数和浮点重载:
LvImgDsc* source = otherCanvas->getImage();