[LVGL] 自定义控件例子

【方法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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值