LVGL自定义组件__页面指示器

news2024/12/25 22:25:18

前言

LVGL对硬件的要求非常低,使用其自带的组件能够搭建出精美的界面,动效也很棒。但是如过移植到Linux平台下,开发稍微复杂的应用项目,那些组件就远远不够用了。为此需要自己自定义一些组件,以方便实用。

效果

为此,尝试开发了一个页面指示器,先看效果:
在这里插入图片描述

代码

Talk is cheap, show me your code.

circles.h

#include "lvgl.h"
#define MAX_INDEX 10
typedef struct circles_ {
    int max_index;
    int active_index;
    lv_style_t *active_style;
    lv_style_t *inactive_style;
    lv_obj_t *circle_list[MAX_INDEX];
    lv_obj_t *parent;
    int (*click_callback)(void);

    const char * name;
    void (*init)(void);
} circles_t;

typedef struct callback_user_data_{
    circles_t *circles;
    int index;
}callback_user_data_t;

// set the active index
int lv_circles_set_active_index(circles_t *circles, int index);
// draw the circles on the screen
int lv_draw_circles(circles_t *circles);

//demo function

void custom_components_circles_demo();

circles.c

#include "circles.h"

// usage:
// 1. define the callback function
void test_cb(lv_event_t *e){

    printf("hello world\n");
}


// 2.init the circles like this: 
void custom_components_circles_demo(){
    static lv_style_t inactive_style;
    lv_style_init(&inactive_style);
    lv_style_set_radius(&inactive_style,5);
    lv_style_set_size(&inactive_style, 10);
    lv_style_set_bg_color(&inactive_style,lv_palette_main(LV_PALETTE_GREY));
    lv_style_set_bg_opa(&inactive_style, 255);
    lv_style_set_text_opa(&inactive_style, 0);

    static lv_style_t active_style;
    lv_style_init(&active_style);
    lv_style_set_radius(&active_style,5);
    // lv_style_set_size(&active_style, 10);
    lv_style_set_width(&active_style, 20);
    lv_style_set_height(&active_style, 10);
    lv_style_set_bg_color(&active_style,lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_bg_opa(&active_style, 255);
    lv_style_set_text_opa(&active_style, 0);

    circles_t *circles;
    circles = (circles_t *)malloc(sizeof(circles_t));
    circles->active_style = &active_style;
    circles->inactive_style = &inactive_style;

    circles->max_index = 3;
    circles->active_index = 0;
    circles->name = "circles";
    circles->parent = lv_obj_create(lv_scr_act());

    lv_obj_set_size(circles->parent, 300, 75);
    lv_obj_set_flex_flow(circles->parent, LV_FLEX_FLOW_ROW);
    lv_obj_align(circles->parent,  LV_ALIGN_TOP_MID, 0, 5);

    circles->click_callback = test_cb;
    lv_draw_circles(circles);

}

int lv_circles_set_active_index(circles_t *circles, int index){
    if(index < 0 || index > circles->max_index) return -1;
    lv_obj_remove_style_all(circles->circle_list[circles->active_index]);
    lv_obj_remove_style_all(circles->circle_list[index]);
    lv_obj_add_style(circles->circle_list[circles->active_index], circles->inactive_style,0);
    lv_obj_add_style(circles->circle_list[index], circles->active_style,0);

    circles->active_index = index;
    return 0;
}
void lv_circles_event_cb(lv_event_t *e){
    callback_user_data_t *user_data = lv_event_get_user_data(e);
    lv_obj_t * btn = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);
    if(code == LV_EVENT_CLICKED){
        lv_circles_set_active_index(user_data->circles, user_data->index);
        if(user_data->circles->click_callback != NULL){
            user_data->circles->click_callback();
        }
    }
}
int lv_draw_circles(circles_t *circles){
    int i = 0;
    for(i =0;i<circles->max_index;i++){
        circles->circle_list[i] = lv_btn_create(circles->parent);
        lv_obj_remove_style_all(circles->circle_list[i]);
        callback_user_data_t *data = malloc(sizeof(callback_user_data_t));
        data->circles = circles;
        data->index = i;
        lv_obj_add_event_cb(circles->circle_list[i], lv_circles_event_cb, LV_EVENT_ALL, data);        
        if(i==circles->active_index){
            lv_obj_add_style(circles->circle_list[i], circles->active_style,0);
        }
        else{
            lv_obj_add_style(circles->circle_list[i], circles->inactive_style,0);
        }
    }
}

使用方法

  1. 项目根目录下,新建文件夹components,把上面的两个文件放进去
  2. 修改makefile
INC  := -I./ui/simulator/inc/ -I./ -I./lvgl/ -I ./components
  1. 要使用时引入头文件
#include "circles.h"
  1. 可以使用自带的Demo快速预览,具体使用方法可以参考Demo函数
custom_components_circles_demo();

配置

参考demo函数初始化配置即可:

  1. 建立点击回调函数,并注册到组件中,在指示器被点击后翻页使用
  2. 初始化active_style,inactive_style,设置自己需要的指示器样式
  3. 创建circles对象,初始化页面总个数和默认激活哪个页面
  4. 画到界面上

总结

由于刚刚上手lvgl,所以这个组件并没有完全基于lvgl中的基础对象lv_obj类型进行编写。感兴趣的同学可以参考官方组件的写法改写哦。

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

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

相关文章

D-star Lite算法及相关思考

一、D-star Lite算法简介 1994年 Anthony Stentz在论文Optimal and Efficient Path Planning for Partially-known Environments中提出了D*算法 D * 算法采用逆向搜索&#xff0c;从目标点向起始点搜索规划&#xff0c;可以处理环境部分未知或全部未知以及动态障碍的一些情况。…

神经网络入门(一)

神经网络入门&#xff08;一&#xff09; 文章目录神经网络入门&#xff08;一&#xff09;1. 神经元2. 网络结构3. 激活函数2.1 激活函数的作用与性质2.2 Sigmoid型函数2.3 Hard-Logistic函数和 Hard-Tanh函数2.4 ReLU函数2.5 常见的激活函数及其导数4. 前馈神经网络4.1 前馈神…

DAY05-网页布局实战选择器CSS样式

文章目录网页布局实战一 CSS选择器a.基本选择器1.元素选择器2.类选择器3.id选择器b.复杂选择器c 伪选择器d 伪元素选择器二 CSS常用样式1.文本相关属性2.背景属性1)背景颜色2)背景图片3)背景平铺4)背景位置5)设置背景图片大小&#xff1a;6)background 背景复合属性案例1案例2案…

Session的使用

Session的使用Session概述Session特性Session原理Session对象操作获取Session对象-----getSession获取SessionID------getId向Session对象存储/修改数据-----setAttribute获取数据------getAttribute删除数据----removeAttributeSession对象失效Session概述 Session对象&#…

rust编程-rust所有权理解(chapter 4.2 引用实质是借用)

目录 2. 引用与借用 2.1 可变(mutable)引用 2.2 悬空&#xff08;dangling&#xff09;引用 2.3 引用的规则总结 2. 引用与借用 上一章节中提到&#xff0c;所有权在函数调用中的转移&#xff0c;函数返回必须同时返还所有权&#xff0c;才能使函数调用后能继续使用某个变量…

[附源码]计算机毕业设计勤工助学管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

jquery 登录-记住密码

jquery 登录-记住密码在登录时&#xff0c;添加记住密码功能&#xff1a;用的 localStorage 存储和获取登录信息 //存储 var username $("input[nameusername]").val(); var password $("input[namepassword]").val(); var validateCode $("inpu…

自动驾驶:2022 apollo day 观后感(一)

2022 apollo day 观后感&#xff08;一&#xff09;注&#xff1a; ppt来自apollo day&#xff0c;结合ppt&#xff0c;讲述一些自己的想法&#xff0c;欢迎批评指正&#xff01;Topic One -- 打造安全、智能、高效的自动驾驶技术体系&#xff08;陈竞凯&#xff09;无人驾驶技…

Ruby ERB模板注入检测

了解Ruby ERB模板注入,Ruby ERB模板注入检测。 ERB是Ruby自带的 <% 写逻辑脚本(Ruby语法) %><%= 直接输出变量值或运算结果 %>require erbtemplate = "text to be generated: <%= x %>" erb_object = ERB.new(template) x = 5 puts erb_object.r…

[附源码]JAVA毕业设计人才公寓管理系统(系统+LW)

[附源码]JAVA毕业设计人才公寓管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

Linux——Xshell、Xftp实现Linux远程登录与应用

目录 一、远程登录 1.1 SSH登录方式 二、Xshell远程连接 2.1 远程连接 2.2 设置粘贴复制 三、Xftp远程连接 3.1 远程连接 3.2 解决乱码 3.3 传输文件 一、远程登录 通常在工作过程中&#xff0c;公司中使用的真实服务器或者是云服务器&#xff0c;都不允许除运维人员 之…

微电网优化调度|农村农业区可再生能源微电网优化调度(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

软件测试就业现状分析,2023是卷还是润?

一、当前软件测试的现状是什么&#xff1f; 现状1、网络上大量人唱衰&#xff0c;测试就业不行了 2022年5月后&#xff0c;越来越多人网络发声“互联网行业不行了”。贴吧、知乎、小红书上&#xff0c;也有大量人反馈软件测试就业惨淡……&#xff0c;篇幅有限&#xff0c;仅…

Docker学习4-常用命令之重要的容器命令

本文是Docker学习系列教程中的第四篇。本文是Docker常用命令中的重要命令。为什么说重要呢&#xff1f;因为这些命令&#xff0c;在以后开发过程中&#xff0c;会经常使用到。比如&#xff1a;怎么查看容器中运行的日志&#xff1f;怎么查看容器运行的进程&#xff1f;怎么导出…

最新中文版本FLStudio21水果音乐软件更新下载

导读&#xff1a;昨晚Image-Line发布FL Studio 2023&#xff0c;而今年也是他们成立第23周年。FL21一经发行便引起了广大制作人的关注&#xff0c;今天我们来介绍一下这款软件。FL Studio是一款音乐编曲软件&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;也是我…

实战:Kind部署k8s集群-2022.12.6(成功测试)

写在前面 原文阅读效果更佳&#xff1a;实战&#xff1a;Kind部署k8s集群-2022.12.6(成功测试) 语雀 《实战&#xff1a;Kind部署k8s集群-2022.12.6(成功测试)》 Kind Kind 是 Kubernetes in Docker 的简写&#xff0c;是一个使用 Docker 容器作为 Node 节点&#xff0c;在…

通关算法题之 ⌈栈和队列⌋

栈和队列 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取…

文件系统实现

文件系统实现&#x1f3de;️1. 整体组织&#x1f301;2. 文件组织&#xff1a;inode&#x1f320;3. 多级索引&#x1f4d6;3.1 间接指针&#x1f4d6;3.2 多重间接指针&#x1f4d6;3.3 基于范围的方法&#x1f30c;4. 目录组织⛺5. 空闲空间管理&#x1f33f;6. 读取和写入文…

Vue 官方文档2.x教程学习笔记 1 基础 1.7 条件渲染

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.7 条件渲染1.7.1 v-if1.7.2 在\<template> 元素上使用 v-if条件渲染分组1.7.3 v-else1.7.4 v-else-if1.7.5 用 key 管理可复用的元素1.7.6 v-show1.7.7 v-if vs v-show1.7.8 v-if 与 v-for 一起…

小网SIM卡QMI拨号无法获取IPv6地址问题的分析

背景 客户反馈设备插小网卡驻网并加载qmi_wwan驱动后,使用多路拨号工具进行两路拨号,第一路无法获取IPv6地址,但是插现网卡测试是没有问题的。具体测试方法如下图: Check后只有第二路有PDN驻网请求,如下图,建议排查QMI拨号工具 分析流程 首先根据客户提供的方法对问…