【方法1】 用页面的思路做,资源释放需要用户调用自定义析构函数处理或通过监听LV_EVENT_DELETE事件回调代码处理。
/**
* @file lv_demo_test.c
*
*/
#include "stdio.h"
#include "stdlib.h"
#include "lvgl.h"
typedef struct
{ // 自定义控件的属性和参数
lv_obj_t *label;
char *str;
} my_btn_param_t;
lv_obj_t *my_btn1;
lv_obj_t *my_btn2;
lv_obj_t *my_btn3;
lv_obj_t *my_btn_create(lv_obj_t *parent, const char *txt)
{
lv_obj_t *btn = lv_btn_create(parent);
lv_obj_set_size(btn, 200, 50);
my_btn_param_t *param = (my_btn_param_t *)malloc(sizeof(my_btn_param_t));
printf("user param addr:%p.|btn addr:%p.\n", param, btn);
param->label = lv_label_create(btn);
param->str = txt;
lv_label_set_text(param->label, txt);
lv_obj_align(param->label, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_user_data(btn, param);
return btn;
}
void my_btn_delete(lv_obj_t *my_btn)
{
lv_obj_del(my_btn);
my_btn_param_t *param = (my_btn_param_t *)lv_obj_get_user_data(my_btn);
if (param)
free(param);
}
void my_btn_set_text_color(lv_obj_t *my_btn, uint32_t color)
{
my_btn_param_t *param = (my_btn_param_t *)lv_obj_get_user_data(my_btn);
lv_obj_set_style_text_color(param->label, lv_color_hex(color), 0);
}
void my_btn_set_text(lv_obj_t *my_btn, char *str)
{
my_btn_param_t *param = (my_btn_param_t *)lv_obj_get_user_data(my_btn);
param->str = str;
lv_label_set_text(param->label, str);
}
char *my_btn_get_text(lv_obj_t *my_btn)
{
my_btn_param_t *param = (my_btn_param_t *)lv_obj_get_user_data(my_btn);
return param->str;
}
void my_timer_cb(lv_timer_t *timer)
{
printf("timer cb.\n");
lv_timer_del(timer);
my_btn_delete(my_btn1);
my_btn_delete(my_btn2);
my_btn_delete(my_btn3);
}
void lv_demo_test(void)
{
lv_obj_t *obj_scr = lv_scr_act();
lv_obj_set_style_bg_color(obj_scr, lv_palette_main(LV_PALETTE_GREEN), 0);
my_btn1 = my_btn_create(obj_scr, "btn1");
my_btn2 = my_btn_create(obj_scr, "btn2");
my_btn3 = my_btn_create(obj_scr, "BTN3");
lv_obj_align(my_btn1, LV_ALIGN_CENTER, 0, -80);
lv_obj_align(my_btn2, LV_ALIGN_CENTER, 0, 20);
my_btn_set_text_color(my_btn1, 0xffff00);
my_btn_set_text_color(my_btn3, 0xff0000);
my_btn_set_text(my_btn1, "testing");
my_btn_set_text(my_btn2, "examing");
printf("SHOW1=%s.\n", my_btn_get_text(my_btn1));
printf("SHOW2=%s.\n", my_btn_get_text(my_btn2));
printf("SHOW3=%s.\n", my_btn_get_text(my_btn3));
//1秒后删除3个按钮对象
lv_timer_create((lv_timer_cb_t)my_timer_cb, 1000, my_btn3);
}
【方法2】 参考系统自带的控件如 label,button 的方法来做,可以自动触发析构函数做资源释放。
#include "lvgl/lvgl.h"
#include "stdio.h"
// 自定义对象类
typedef struct {
lv_obj_t obj; // LVGL 基础对象
// 这里可以添加更多自定义数据或控件
} my_custom_obj_t;
// 自定义类的声明
static void my_custom_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj);
static void my_custom_destructor(const lv_obj_class_t* class_p, lv_obj_t* obj);
static void my_custom_event_cb(lv_event_t* e);
// 定义自定义类
static const lv_obj_class_t my_custom_class = {
.base_class = &lv_obj_class, // 继承自基本对象类
.constructor_cb = my_custom_constructor, // 构造器回调
.destructor_cb = my_custom_destructor, //析构回调
.width_def = LV_SIZE_CONTENT, // 默认宽度
.height_def = LV_SIZE_CONTENT, // 默认高度
};
// 构造函数,用于初始化对象
static void my_custom_constructor(const lv_obj_class_t* class_p, lv_obj_t* obj) {
LV_UNUSED(class_p);
printf("=====my_custom_constructor.====\n");
// 为自定义对象分配内存用于存储子控件的指针
my_custom_obj_t* custom_obj = (my_custom_obj_t*)lv_mem_alloc(sizeof(my_custom_obj_t));
lv_obj_set_user_data(obj, custom_obj);
//添加控件内自控件的初始化和布局等
// 注册事件处理回调
lv_obj_add_event_cb(obj, my_custom_event_cb, LV_EVENT_DRAW_MAIN, NULL);
}
// 析构函数,用于销毁资源,当对象被删除时会触发此函数
static void my_custom_destructor(const lv_obj_class_t* class_p, lv_obj_t* obj)
{
LV_UNUSED(class_p);
printf("=====my_custom_destructor.====\n");
// 获取并释放存储的自定义数据
my_custom_obj_t* custom_obj = (my_custom_obj_t*)lv_obj_get_user_data(obj);
if (custom_obj) {
lv_mem_free(custom_obj);
}
}
// 事件处理回调函数
static void my_custom_event_cb(lv_event_t* e) {
lv_obj_t* obj = lv_event_get_target(e);
lv_draw_ctx_t* draw_ctx = lv_event_get_draw_ctx(e);
lv_area_t coords;
lv_obj_get_coords(obj, &coords);
lv_event_code_t code = lv_event_get_code(e);
printf("====> event_cb, code=%d.\n",code);
lv_draw_rect_dsc_t rect_dsc;
lv_draw_rect_dsc_init(&rect_dsc);
rect_dsc.bg_color = lv_color_hex(0xff8800); // 背景颜色
rect_dsc.border_color = lv_color_hex(0x0000ff); // 边框颜色
rect_dsc.border_width = 4; // 边框宽度
rect_dsc.radius = 10; // 圆角半径
lv_draw_rect(draw_ctx, &rect_dsc, &coords);
}
// 创建自定义对象
lv_obj_t* my_custom_obj_create(lv_obj_t* parent)
{
lv_obj_t *obj = lv_obj_class_create_obj(&my_custom_class, parent);
printf("createing obj, addr=%p.\n", obj);
lv_obj_class_init_obj(obj);
return obj;
}
int main(void) {
lv_init(); // 初始化LVGL
// 显示和输入初始化代码应在此处
// 创建屏幕并加载
lv_obj_t* scr = lv_scr_act();
// 创建自定义对象
lv_obj_t* custom_obj = my_custom_obj_create(scr);
lv_obj_set_size(custom_obj, 100, 50);
lv_obj_center(custom_obj);
while (1) {
lv_timer_handler(); // LVGL的定时器处理
// 添加你自己的延时处理,例如任务延时
}
return 0;
}

4200

被折叠的 条评论
为什么被折叠?



