LVGL学习之创建一个Button


前言

LVGL全称Light and Versatile Graphics Library,是一个自由的,开源的GUI库,界面精美,资源消耗小,可移植度高,响应式布局等特点,全库采用纯 c 语言开发,可移植性高。


提示:以下是本篇文章正文内容,下面案例可供参考

一、创建一个Button

1.引入库(LVGL V8)

首先在使用lvgl之前,你可以有多种方式,直接在电脑端下载模拟器进行运行,第二种,移植到开发板,在开发板上运行;移植的教程也是非常的多,我这里就不重复造轮子了,直接贴各位大神已经做好的:
Arduino环境下玩转 LVGL-搭建环境
codeblocks运行lvgl8

2.Arduino下使用LVGL创建一个Button

Arduino是一款便捷灵活、方便上手的开源电子原型平台,这个平台目前支持非常多的芯片,我这里是使用的乐鑫的ESP32-WROOM,LVGL版本是V8,因此如果版本不一样的同学,会存在编译不通过的问题;
首先需要移植LVGL库至我们的Arduino环境,很方便,链接放这:LVGL移植进板卡
在移植完之后,我们可以搜索LVGL V8的API函数,来写我们的界面了,这里建议先从按键开始,逐次递进;

按键(copy的@Bob_1993他的)

static void btn_event_callback(lv_event_t* event)
{
    static uint32_t counter = 1;
 
    lv_obj_t* btn = lv_event_get_target(event); //获取事件对象
    if (btn != NULL)
    {
        lv_obj_t* label = lv_obj_get_child(btn, 0); // 获取第一个子对象
        if (label != NULL)
        {
            lv_label_set_text_fmt(label, "%d", counter); //设置显示内容
            counter++;
        }
    }
}
 
 
void lv_button_click_event_test()
{
    lv_obj_t* btn = lv_btn_create(lv_scr_act()); // 创建Button对象
    if (btn != NULL)
    {
        lv_obj_set_size(btn, 100, 50); // 设置对象大小,宽度和高度
        lv_obj_set_pos(btn, 110, 150);; // 设置按钮位置,即X和Y坐标
        lv_obj_add_event_cb(btn, btn_event_callback, LV_EVENT_CLICKED, NULL); // 给对象添加CLICK事件和事件处理回调函数
 
        lv_obj_t* label = lv_label_create(btn); // 基于Button对象创建Label对象
        if (label != NULL)
        {
            lv_label_set_text(label, "Click me!"); // 设置显示内容
            lv_obj_center(label); // 对象居中显示
        }
    }
}

滑块(copy的@Bob_1993他的)

static void slider_event_callback(lv_event_t* event)
{
    lv_obj_t * slider = lv_event_get_target(event);
    if (slider != NULL)
    {
        lv_obj_t* label = (lv_obj_t* )lv_event_get_user_data(event);
        if (label != NULL)
        {
            // 刷新label对象的文本
            lv_label_set_text_fmt(label, "%d", lv_slider_get_value(slider));
            lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15);  // 设置对齐,label对象在slider对象上方中间位置
        }
    }
}
 
 
void lv_slider_test()
{
    lv_obj_t * slider = lv_slider_create(lv_scr_act()); // 创建滑块对象
    if (slider != NULL)
    {
        lv_obj_set_width(slider, 200); // 设置slider的宽度
        lv_obj_center(slider);  // 对样显示在屏幕中央
        lv_slider_set_range(slider, 10, 200); // 设置滑块值的变化范围10-200
 
        lv_obj_t* label = lv_label_create(lv_scr_act()); // 创建一个标签,用于显示滑块的滑动值
        if (label != NULL)
        {
            lv_label_set_text_fmt(label, "%d", lv_slider_get_min_value(slider)); // 标签默认显示滑块的最小值
            lv_obj_align_to(label, slider, LV_ALIGN_OUT_TOP_MID, 0, -15);  // 标签对象放在slider对象的上方中间位置
 
            // 添加滑块值变化事件和事件回调函数,并将label对象最为事件的user_data
            lv_obj_add_event_cb(slider, slider_event_callback, LV_EVENT_VALUE_CHANGED, (void *)label);
        }
    }
}

在写好这个界面之后勒,直接放入函数的steup也就是初始化中,像这样:

void setup()
{
   lv_init();
   tft.begin();          /* TFT init */
   tft.setRotation( 1 ); /* Landscape orientation, flipped */

   /*Set the touchscreen calibration data,
     the actual data for your display can be aquired using
     the Generic -> Touch_calibrate example from the TFT_eSPI library*/
  uint16_t calData[5] = { 442, 3414, 336, 3425, 3 };
  tft.setTouch(calData);

   lv_disp_draw_buf_init( &draw_buf, buf, NULL, screenWidth * 10 );

   /*Initialize the display*/
   static lv_disp_drv_t disp_drv;
   lv_disp_drv_init( &disp_drv );
   /*Change the following line to your display resolution*/
   disp_drv.hor_res = screenWidth;
   disp_drv.ver_res = screenHeight;
   disp_drv.flush_cb = my_disp_flush;
   disp_drv.draw_buf = &draw_buf;
   lv_disp_drv_register( &disp_drv );

   /*Initialize the (dummy) input device driver*/
   static lv_indev_drv_t indev_drv;
   lv_indev_drv_init( &indev_drv );
   indev_drv.type = LV_INDEV_TYPE_POINTER;
   indev_drv.read_cb = my_touchpad_read;
   lv_indev_drv_register( &indev_drv );
   lv_button_click_event_test();//按键
   lv_slider_test();		    //滑块
}

直接放在初始化里,上电执行一次就好,LOOP结构如下:

void loop()
{
   lv_timer_handler(); /* let the GUI do its work */
   lv_tick_inc(5);
   delay(5);
}

就很神奇。

效果

然后编译上传,LVGL上层控件这些都是一样的,前提是版本一致,不一样的是每一个板子的TFT驱动,因为接线不一致嘛!
请添加图片描述

总结

有了LVGL的支持,我们可以在一些小设备上实现非常丰富的图形界面效果,即方便,又精美,真的是感谢大神们了。致敬开源精神。今日份水文到此结束!!!

参考

安利这个博主:@Bob_1993,他也在学LVGL V8,代码都是可以直接使用的,走在我们前面了属于是;
板卡链接:(闲鱼)ESP32 LVGL学习板卡

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值