我有一个在嵌入式设备上运行的简单 lvgl 示例。它应该像现有图像之上的叠加层一样工作。在这种情况下,我只想渲染标签的文本,因此标签和屏幕应该有透明的背景。
我的方法是设定
lv_obj_set_style_bg_opa(screen, LV_OPA_TRANSP, 0);
在屏幕上和
lv_style_set_bg_opa(&label_style, LV_OPA_TRANSP);
在标签上。
这不会渲染任何内容(我得到一个完全透明的窗口,没有内容)。删除
lv_obj_set_style_bg_opa(screen, LV_OPA_TRANSP, 0);
将导致出现带有透明背景的红色标签的绿屏。
#include "lvgl/lvgl.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
static const char * getenv_default(const char * name, const char * dflt)
{
return getenv(name) ?: dflt;
}
static lv_obj_t * example_label;
int main(void)
{
lv_init();
const char * device = getenv_default("LV_LINUX_FBDEV_DEVICE", "/dev/fb0");
lv_display_t * disp = lv_linux_fbdev_create();
lv_linux_fbdev_set_file(disp, device);
lv_obj_t * screen = lv_obj_create(NULL);
lv_screen_load(screen);
//lv_obj_set_style_bg_opa(screen, LV_OPA_TRANSP, 0);
lv_obj_set_style_bg_color(screen, lv_color_make(0, 255, 0), 0);
static lv_style_t label_style;
lv_style_init(&label_style);
lv_style_set_text_color(&label_style, lv_color_hex(0xFF0000));
lv_style_set_bg_opa(&label_style, LV_OPA_TRANSP);
lv_style_set_bg_color(&label_style, lv_color_hex(0x0000FF));
lv_style_set_text_font(&label_style, &lv_font_montserrat_32);
example_label = lv_label_create(screen);
lv_label_set_text(example_label, "Hello World");
lv_obj_add_style(example_label, &label_style, LV_PART_MAIN | LV_STATE_DEFAULT);
lv_obj_align(example_label, LV_ALIGN_BOTTOM_MID, 0, 0);
while(1) {
lv_timer_handler();
usleep(5000);
}
return 0;
}
在
lv_conf.h
我一直在玩
#define LV_COLOR_DEPTH 32
#define LV_USE_LINUX_FBDEV 1
#if LV_USE_LINUX_FBDEV
#define LV_LINUX_FBDEV_BSD 0
//#define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT
#define LV_LINUX_FBDEV_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL
//#define LV_LINUX_FBDEV_BUFFER_COUNT 1
#define LV_LINUX_FBDEV_BUFFER_COUNT 2
#define LV_LINUX_FBDEV_BUFFER_SIZE 60
#endif
似乎在某个时候有一个
LV_COLOR_SCREEN_TRANSP
选项,但现在没有了。
我正在使用来自 https://github.com/lvgl/lv_port_linux 的lvgl linux 端口,并尝试了 v9.0 和 master。
我还设法通过帧缓冲区在 QT 中运行相同的示例,因此设备(硬件和软件)肯定支持此功能。
似乎在
lv_display_set_color_format(NULL, LV_COLOR_FORMAT_ARGB8888);
完成工作后立即设置 lv_screen_load(screen);
。因此不需要在lv_conf.h
中进行特殊设置。