LVGL 主题

news2024/11/15 10:09:50

LVGL 主题

修改样式的一点个人心得

lvgl的样式众多,本人是记不住的,用的时候可以快速查找即可

  1. 查看官方例子
    查看官方例子可以快速了解组件的基础样式
    在这里插入图片描述

  2. 使用官方的 SquareLineStudio 软件,配置出想要的效果,再生成参考代码

SquareLineStudio 配置界面很是方便,但是奈何UI和其他任务总是分离的不彻底,因此个人习惯只是参考生成的代码,然后利用之前的界面管理工具,为每个界面都创建一个.c文件。

在这里插入图片描述

  1. 参考 lv_theme_default.c 中 theme_apply 函数的相关部分
    在这里插入图片描述
    在这里插入图片描述

在 lv_port_disp_init 函数中会应用默认的主题,这也是为什么创建出控件时会自带样式。

在这里插入图片描述
对对应控件的默认样式进行屏蔽或修改,测试出要修改样式的部分,然后再恢复默认样式,在创建控件后 使用 lv_obj_set_style_xxxx 单独对控件样式进行修改。

通过修改主题,使字体图片选中时反色

有时候需要全局修改某个控件样式,最简单的就是通过主题修改,当然创建控件后进行单独修改也是可以的。

extern const lv_img_dsc_t CS_ImgSignalWifi;
extern const lv_img_dsc_t CS_ImgSignal4g;

static lv_style_t s_style_bg_color;
static lv_style_t s_style_list_color;
static lv_style_t s_style_focus_bg_color;
static lv_style_t s_style_focus_img_color;
static lv_style_t s_style_text_selected_color;


/**
 * @brief 聚焦后改变图片状态 从而改变图片颜色
 * @param e
*/
static void img_focus_event_cb(lv_event_t* e)
{
    lv_obj_t* btn = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);

    if (code == LV_EVENT_FOCUSED)
    {
        for (int i = 0; i < lv_obj_get_child_cnt(btn); i++)
        {
            lv_obj_t* obj = lv_obj_get_child(btn, i);
            if (lv_obj_check_type(obj, &lv_img_class))
            {
                lv_obj_add_state(obj, LV_STATE_USER_1);
            }
        }
    }
    else if (code == LV_EVENT_DEFOCUSED)
    {
        for (int i = 0; i < lv_obj_get_child_cnt(btn); i++)
        {
            lv_obj_t* obj = lv_obj_get_child(btn, i);
            if (lv_obj_check_type(obj, &lv_img_class))
            {
                lv_obj_clear_state(obj, LV_STATE_USER_1);
            }
        }
    }
}


/*Will be called when the styles of the base theme are already added
  to add new styles*/
static void new_theme_apply_cb(lv_theme_t* th, lv_obj_t* obj)
{
    LV_UNUSED(th);

    /* 配置下拉列表 主题样式 */
    if (lv_obj_check_type(obj, &lv_dropdown_class)) {
        lv_obj_add_style(obj, &s_style_bg_color, LV_PART_MAIN | LV_STATE_DEFAULT);
        lv_obj_add_style(obj, &s_style_focus_bg_color, LV_PART_MAIN | LV_STATE_FOCUS_KEY);
        lv_obj_add_style(obj, &s_style_focus_bg_color, LV_PART_MAIN | LV_STATE_FOCUSED);
    }

    if (lv_obj_check_type(obj, &lv_dropdownlist_class)) {
        lv_obj_add_style(obj, &s_style_text_selected_color, LV_PART_SELECTED | LV_STATE_CHECKED);
        lv_obj_add_style(obj, &s_style_list_color, LV_PART_MAIN | LV_STATE_DEFAULT);
    }

    /* 配置按键 主题样式 */
    if (lv_obj_check_type(obj, &lv_btn_class))
    {
        /* 选中时样式 */
        lv_obj_add_style(obj, &s_style_focus_bg_color, LV_PART_MAIN | LV_STATE_FOCUS_KEY);
        lv_obj_add_style(obj, &s_style_focus_bg_color, LV_PART_MAIN | LV_STATE_FOCUSED);

        lv_obj_add_style(obj, &s_style_bg_color, LV_PART_MAIN | LV_STATE_DEFAULT);
    }

    /* 配置图片 主题样式 */
    if (lv_obj_check_type(obj, &lv_img_class))
    {
        /* LV_STATE_USER_1 时样式  */
        lv_obj_add_style(obj, &s_style_focus_img_color, LV_PART_MAIN | LV_STATE_USER_1);
    }
}


static lv_obj_t* theme_test(const uint32_t id, void* param)
{
    lv_obj_t* screen = lv_obj_create(NULL);

    lv_disp_t* dispp = lv_disp_get_default();
    lv_theme_t* theme = lv_theme_default_init(dispp, lv_color_hex(0xffff), lv_color_hex(0xffffff), true, &lv_font_montserrat_14);
    lv_disp_set_theme(dispp, theme);

#if 1
    lv_style_init(&s_style_bg_color);
    lv_style_set_bg_color(&s_style_bg_color, lv_color_hex(0x505050));
    lv_style_set_bg_opa(&s_style_bg_color, 255);

    lv_style_init(&s_style_list_color);
    lv_style_set_bg_color(&s_style_list_color, lv_color_hex(0x929495));
    lv_style_set_bg_opa(&s_style_list_color, 255);

    lv_style_init(&s_style_focus_bg_color);
    lv_style_set_bg_color(&s_style_focus_bg_color, lv_color_hex(0xffff));
    lv_style_set_text_color(&s_style_focus_bg_color, lv_color_hex(0));
    lv_style_set_text_opa(&s_style_focus_bg_color, LV_OPA_100);
    lv_style_set_border_width(&s_style_focus_bg_color, 0);
    lv_style_set_outline_pad(&s_style_focus_bg_color, 0);
    lv_style_set_outline_width(&s_style_focus_bg_color, 0);

    lv_style_init(&s_style_focus_img_color);
    lv_style_set_img_recolor(&s_style_focus_img_color, lv_color_hex(0x0));
    lv_style_set_img_recolor_opa(&s_style_focus_img_color, LV_OPA_100);

    lv_style_init(&s_style_text_selected_color);
    lv_style_set_text_color(&s_style_text_selected_color, lv_color_hex(0));

    lv_theme_t* th_act = lv_disp_get_theme(NULL);
    static lv_theme_t th_new;
    th_new = *th_act;

    /*Set the parent theme and the style apply callback for the new theme*/
    lv_theme_set_parent(&th_new, th_act);
    lv_theme_set_apply_cb(&th_new, new_theme_apply_cb);

    /*Assign the new theme the the current display*/
    lv_disp_set_theme(NULL, &th_new);

#endif

    lv_obj_t* dropdown = lv_dropdown_create(screen);
    
    lv_dropdown_set_options(dropdown, "Apple\n"
        "Banana\n"
        "Orange\n"
        "Cherry\n"
        "Grape\n"
        "Raspberry\n"
        "Melon\n"
        "Orange\n"
        "Lemon\n"
        "Nuts");

    lv_obj_align(dropdown, LV_ALIGN_TOP_MID, 0, 100);

    {
        lv_obj_t* btn = lv_btn_create(screen);
        lv_obj_align(btn, LV_ALIGN_TOP_MID, -100, 20);
        lv_obj_set_size(btn, 100, 40);
        lv_obj_add_event_cb(btn, img_focus_event_cb, LV_EVENT_ALL, NULL);

        lv_obj_t* lab = lv_label_create(btn);
        lv_label_set_text(lab, "btn1");
        lv_obj_align(lab, LV_ALIGN_RIGHT_MID, 0, 0);

        lv_obj_t* img = lv_img_create(btn);
        lv_img_set_src(img, &CS_ImgSignalWifi);
        lv_obj_align(img, LV_ALIGN_LEFT_MID, 0, 0);
    }

    {
        lv_obj_t* btn = lv_btn_create(screen);
        lv_obj_align(btn, LV_ALIGN_TOP_MID, 100, 20);
        lv_obj_set_size(btn, 100, 40);
        lv_obj_add_event_cb(btn, img_focus_event_cb, LV_EVENT_ALL, NULL);

        lv_obj_t* lab = lv_label_create(btn);
        lv_label_set_text(lab, "btn2");
        lv_obj_align(lab, LV_ALIGN_RIGHT_MID, 0, 0);

        lv_obj_t* img = lv_img_create(btn);
        lv_img_set_src(img, &CS_ImgSignal4g);
        lv_obj_align(img, LV_ALIGN_LEFT_MID, 0, 0);
    }
    return screen;
}

请添加图片描述
想要图片选中反色,需要使用.png图片,在官网 转换时转换为带透明通道格式的
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux系统基础知识-基础IO

IO 概念引入位图的概念IO的系统调用函数openwriteread()close简单使用样例&#xff1a; 文件描述符fd默认文件流stdin/stdout/stderr文件描述符的分配规则 重定向的概念输出重定向输入重定向追加重定向dup2()系统调用总结 文件缓冲区深入理解缓冲区的概念输出缓冲区部分代码解释…

基于ssm的儿童影楼拍摄管理系统的设计与实现+vue论文

基于SSM的儿童影楼拍摄管理系统的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于商品信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&…

实时云渲染是什么?它的应用方向有哪些?

实时云渲染有三个关键词&#xff0c;"实时"、"云"和"渲染"&#xff0c;它们分别表示&#xff1a;同步、云服务器计算和图像生成过程&#xff0c;简单来说就是使用第三方平台快速完成渲染任务&#xff0c;它有两个实用方向&#xff1a; 一、实时渲…

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案

媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…

Master01节点免密钥登录其他节点

1、执行命令 ssh-keygen -t rsa&#xff0c;一直敲回车 2、for i in k8s-master01 k8s-node01 k8s-node02;do ssh-copy-id -i .ssh/id_rsa.pub $i;done 输入yes和对应节点密码

PostGIS教程学习十九:基于索引的聚簇

PostGIS教程学习十九&#xff1a;基于索引的聚簇 数据库只能以从磁盘获取信息的速度检索信息。小型数据库将完全位于于RAM缓存&#xff08;内存&#xff09;&#xff0c;并摆脱物理磁盘访问速度慢的限制。但是对于大型数据库&#xff0c;对物理磁盘的访问将限制数据库的信息检…

在VS Code中安装Copilot与安装其他扩展的方法一样,只需简单几步

GitHub Copilot是由OpenAI和GitHub开发的人工智能工具。它的目的是通过自动完成代码来帮助开发人员使用集成开发环境&#xff08;IDE&#xff09;&#xff0c;如Visual Studio Code。它目前仅作为技术预览版提供&#xff0c;因此只有在候补名单上被认可的用户才能访问它。对于用…

纯血鸿蒙「扩圈」100天,酝酿已久的突围

坦白讲&#xff0c;去年参加华为开发者大会看到HarmonyOS NEXT&#xff08;仅运行鸿蒙原生应用&#xff0c;所以也称作「纯血鸿蒙」&#xff09;的时候&#xff0c;小雷也没料想到鸿蒙原生应用生态的发展速度会如此之快。 9月25日&#xff0c;华为正式对外宣布启动HarmonyOS NE…

PTA✨C语言 就不告诉你

7-7 就不告诉你 分数 15 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 做作业的时候&#xff0c;邻座的小盆友问你&#xff1a;“五乘以七等于多少&#xff1f;”你应该不失礼貌地围笑着告诉他&#xff1a;“五十三。”本题就要求你&#xff0c;对任何一对给定的正…

2024年美国大学生数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

[前车之鉴] SpringBoot原生使用Hikari数据连接池升级到动态多数据源的深坑解决方案 RocketMQ吞掉异常问题排查

文章目录 背景说明蒙蔽双眼口说无凭修补引发的新问题解决配置问题 本地监控佐证万法归元 背景说明 当前业务场景我们使用原生SpringBoot整合Hikari数据源连接池提供服务&#xff0c;但是近期业务迭代需要使用动态多数据源&#xff0c;很自然想到dynamic-source&#xff0c;结果…

Python教程37:使用turtle画一个戴帽子的皮卡丘

---------------turtle源码集合--------------- Python教程36&#xff1a;海龟画图turtle写春联 Python源码35&#xff1a;海龟画图turtle画中国结 Python源码31&#xff1a;海龟画图turtle画七道彩虹 Python源码30&#xff1a;海龟画图turtle画紫色的小熊 Python源码29&a…

linux 系统安全及应用

一、账号安全基本措施 1.系统账号清理 1.将用户设置为无法登录 /sbin/nologin shell——/sbin/nologin却比较特殊&#xff0c;所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已&#xff0c;并不是说这个账号就无法使用系统资源。举例来说&#xff0c;…

JAVA基础学习笔记-day15-File类与IO流

JAVA基础学习笔记-day15-File类与IO流 1. java.io.File类的使用1.1 概述1.2 构造器1.3 常用方法1、获取文件和目录基本信息2、列出目录的下一级3、File类的重命名功能4、判断功能的方法5、创建、删除功能 2. IO流原理及流的分类2.1 Java IO原理2.2 流的分类2.3 流的API 3. 节点…

SNP浅谈SAP系统增强及二次开发

SAP 系统增强和二次开发是指在 SAP 系统的基础上&#xff0c;对现有功能进行扩展和增强&#xff0c;以满足特定业务需求。增强和二次开发可以通过不同的方法实现&#xff0c;包括&#xff1a; ■ 数据集成&#xff1a;通过创建数据接口&#xff0c;实现 SAP 系统与其他系统之间…

视频智能分析/边缘计算AI智能分析网关V4区域入侵检测算法如何配置?

边缘计算AI智能分析网关&#xff08;V4版&#xff09;部署了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;并上报识别结果&#xff0c;并能进行语音告警播放。算法配置后&#xff0c;即可对监控视频流进行实时检测&#xf…

基于 Canvas 的多行文本溢出方案

说到文本溢出&#xff0c;大家应该都不陌生&#xff0c;中文网络上的文章翻来覆去就是下面3种方法&#xff1a; 单行文本溢出 这是日常开发中用的最多的&#xff0c;核心代码如下&#xff1a; p {width: 300px;overflow: hidden; white-space: nowrap; /*文本不会换行*/text…

基于模块自定义扩展字段的后端逻辑实现(二)

目录 一&#xff1a;创建表 二&#xff1a;代码逻辑 上一节我们详细讲解了自定义扩展字段的逻辑实现和表的设计&#xff0c;这一节我们以一个具体例子演示下&#xff0c;如何实现一个订单模块的自定义扩展数据。 一&#xff1a;创建表 订单主表: CREATE TABLE t_order ( …

rime中州韵小狼毫 中英互绎 滤镜

英文在日常生活中已经随处可见&#xff0c;我们一般中英互译需要使用专业的翻译软件来实现。但如果我们在输入法中&#xff0c;在输入中文的时候&#xff0c;可以顺便瞟一眼对应的英文词汇&#xff0c;或者在输入英文的时候可以顺便了解对应的中文词汇&#xff0c;那将为我们的…

1.8 day6 IO进程线程

使用有名管道实现两个进程之间的通信 进程A #include <myhead.h> int main(int argc, const char *argv[]) {//创建两个文件描述符用于打开两个管道int fd1-1;int fd2-1;//创建一个子进程int pid-1;if((fd1open("./mkfifo1",O_RDWR))-1){perror("open er…