Lvgl Overlay - 透明屏幕上的元素

问题描述 投票:0回答:1

我有一个在嵌入式设备上运行的简单 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 中运行相同的示例,因此设备(硬件和软件)肯定支持此功能。

framebuffer alpha-transparency lvgl
1个回答
0
投票

似乎在

lv_display_set_color_format(NULL, LV_COLOR_FORMAT_ARGB8888);
完成工作后立即设置
lv_screen_load(screen);
。因此不需要在
lv_conf.h
中进行特殊设置。

© www.soinside.com 2019 - 2024. All rights reserved.