LVGL笔记12--event事件

LVGL笔记12–event事件

在 littleVGL 中任何对象都可以注册事件,这是在新版本中才加入的特性,分为通用事件和专用事件,总共支持 20 种事件类型,这是一个总和哈,并不是指每一个对象都具有 20 种事件类型,事件可以是由 littleVGL 库自身触发的,也可以是由外部物理操作触发的,比如触摸,点击等等,当然了,我们也可以通过调用 lv_event_send 接口来手动发送事件进行触发,同时可以携带用户自定义的数据.


Events的API接口
主要数据类型
  • 事件数据类型

    enum {	
        	//对象被按下时触发,每次按下时只触发一次 
        	LV_EVENT_PRESSED,
        
        	//对象正在被按下中,只要按下不放,就会一直被触发
        	LV_EVENT_PRESSING,
        
        	//在按下的过程中,手指从对象的可视区域划出时被触发
        	LV_EVENT_PRESS_LOST,
        
        	//在 LV_INDEV_LONG_PRESS_TIME 时间之前松手触发,也就是短按触发;如果是在被拖拽的话,则不会被触发
            LV_EVENT_SHORT_CLICKED, 
        
        	//按下时长超过 LV_INDEV_LONG_PRESS_TIME 值时触发, 只会触发一次,如果是在被拖拽的话,则不会被触发   
        	LV_EVENT_LONG_PRESSED,
        
        	//在触发 LV_EVENT_LONG_PRESSED 事件之后,接下来按下的时长每超过LV_INDEV_LONG_PRESS_REP_TIME 值一次,就会被触发一次,如果是在被拖拽的话,则不会被触发(也就是长按触发)
        	LV_EVENT_LONG_PRESSED_REPEAT,
        
            //只要松手了就会被触发,但是如果触发了 LV_EVENT_PRESS_LOST 事件的话,那么此事件会被触发
            LV_EVENT_CLICKED, 
    
            //和 LV_EVENT_CLICKED 事件一样,没啥区别,位于 LV_EVENT_CLICKED 事件之后触发 
            LV_EVENT_RELEASED, 
        
            LV_EVENT_DRAG_BEGIN,//拖拽开始时触发 
    
            LV_EVENT_DRAG_END,//拖拽结束时触发
        
        	LV_EVENT_DRAG_THROW_BEGIN,//拖拽漂移开始时触发
        	
        	//当实体按键被按下时触发,我们一般都是用触摸屏作为输入,所以此事件一般用不到
    	    LV_EVENT_KEY, 
        
            LV_EVENT_FOCUSED,//当对象在其所在的 group 组获得焦点时触发
    
            LV_EVENT_DEFOCUSED,//当对象在其所在的 group 组失去焦点时触发
    
            LV_EVENT_VALUE_CHANGED,//对象的数值改变时被触发,如 lv_slider 滑动控件
    
            LV_EVENT_INSERT,//有东西插入到对象上时触发,如 lv_ta 文本框控件
        
            //可以说是留给用户使用的一种事件,用户只能通过 lv_event_send 接口来手动发送触发此事件
            LV_EVENT_REFRESH,
    
            //点击 lv_kb 键盘控件上的”OK”, ”Apply”等相似词义的按钮时触发
            LV_EVENT_APPLY, 
    
            //点击 lv_kb 键盘控件上的”Close”, ”Cancel”等相似词义的按钮时触发
            LV_EVENT_CANCEL, 
    
            LV_EVENT_DELETE //对象被删除时触发
    };
    typedef uint8_t lv_event_t;
    
API接口函数
  • 设置事件回调函数

    /*------------------------------------------------------------------------------
    	这个函数用来设置事件回调函数
    	obj: 对象句柄
    	event_cb: 事件回调函数
    --------------------------------------------------------------------------------*/
    void lv_obj_set_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb);
    
  • 手动发送事件

    /*------------------------------------------------------------------------------
    	这个函数用来手动发送数据,这里需要注意 event 参数,系统是自带了 20 种事件类型,其对应的值是从 0 到 19,除了给event 参数传系统自带的事件外,其实我们还可以传用户自定义的事件的,范围为:[20,255]
    	
    	参数:
            obj: 给哪一个对象发送事件
            event: 需要发送的事件名
            data: 携带的用户自定义数据
        返回值:
            LV_RES_OK:对象没有被删除
            LV_RES_INV:对象在事件中被删除了
    --------------------------------------------------------------------------------*/
    lv_res_t lv_event_send(lv_obj_t * obj, lv_event_t event, const void * data);
    
    #define USER_EVENT_START 20
    #define USER_EVENT_1 (USER_EVENT_START+1)
    static void btn_event_cb(lv_obj_t * obj,lv_event_t event)
    {
     	if(event==USER_EVENT_1)
     	{
     		printf("用户自定义事件 1 被触发了\r\n");
    	} 
    }
    lv_obj_t* btn1 = lv_btn_create(src, NULL);
    lv_obj_set_event_cb(btn1,btn_event_cb);	//设置回调函数
    //手动发送 USER_EVENT_1 事件,不携带参数
    lv_event_send( btn1,USER_EVENT_1,NULL );
    
  • 给任意事件回调函数手动发送事件

    /*--------------------------------------------------------------------------------
    	这个函数是把设置回调函数和发送事件的两步操作变成了一步,所以这个函数等价于lv_obj_set_event_cb 和 lv_event_send 这二个函数的一起调用
    	
    	event_xcb: 给哪一个事件回调函数发送事件
        obj: 给哪一个对象发送事件
        event: 需要发送的事件名
        data: 携带的用户自定义数据
        返回值:
        	LV_RES_OK:对象没有被删除
    		LV_RES_INV:对象在事件中被删除了
    --------------------------------------------------------------------------------*/
    lv_res_t lv_event_send_func(lv_event_cb_t event_xcb, lv_obj_t * obj, lv_event_t event,const void * data);
    
  • 获取当前事件的用户自定义参数

    /*--------------------------------------------------------------------------------
    	这个函数是返回当前事件的用户数据,是当前已经触发了的事件,此API函数一般的用法是放在事件回调
    	函数中进行调用
    	
    	返回值:返回用户自定义数据
    --------------------------------------------------------------------------------*/
    const void * lv_event_get_data(void);
    
    //使用实例
    #define USER_EVENT_START 20
    #define USER_EVENT_1 (USER_EVENT_START+1)
    
    //构建一个用户自定义数据结构体,当然了,如果你的用户数据简单,可以不用结构体
    typedef struct{
        char name[20];
        u8 age;
    }USER_DATA;
    
    USER_DATA user_data = {{"xiong jia yu"},25};//初始化一下
    
    //事件回调函数
    static void btn_event_cb(lv_obj_t * obj,lv_event_t event)
    {
        USER_DATA *data;
        if(event==USER_EVENT_1)//当然了,这里可以是其他的任何事件,
        {
            data = (USER_DATA*) lv_event_get_data();//获取到用户的自定义数据
            printf(“name:%s,age:%d\r\n”,data ->name,data->age);
        } 
    }
    
    void user_data_test(void)
    {
        lv_event_send(btn1,USER_EVENT_1,&user_data);//发送事件,同时携带用户自定义参数
    }
    

2021–2-14–wrs

<think>好的,我现在需要帮助用户查找LVGL框架中图像按钮的使用方法和示例代码。首先,我要回顾用户的问题,确认需求。用户明确提到“lvgl 图像按钮 使用方法 示例代码”,并且引用了几个相关的站内资料。 先看看用户提供的引用内容。引用[1]提到ESP32开发笔记中的ImageButton控件,说明如何用lv_imgbtn_set_src设置不同状态的图像,并且指出图像按钮不支持符号。引用[2]讨论了图像和标签的互换使用,比如用LV_SYMBOL_DUMMY来显示文本。引用[3]展示了普通按钮的创建和回调设置,而引用[4]是关于LVGL控件的一般使用。 用户需要的是图像按钮(lv_imgbtn)的具体使用方法,而不是普通按钮。所以,我需要将引用中的相关信息整合起来,特别是引用[1]中的示例代码和函数调用。同时,可能需要参考普通按钮的回调设置(引用[3])来补充图像按钮的事件处理。 接下来,确保回答结构清晰,分步骤说明创建图像按钮的流程。首先创建图像按钮对象,然后设置不同状态下的图像源,调整位置大小,最后设置事件回调。需要确认是否正确处理了图像源的不同状态,比如释放、按下、禁用等,如引用[1]提到的LV_BTN_STATE_...。 另外,引用[2]提到的透明度可能需要注意,但用户主要关注的是图像按钮的创建和使用,所以可能暂时不需要深入讨论透明度,除非示例中有涉及。同时,要注意图像按钮不支持符号,因此只能用图像,不能像普通按钮那样混合文本,除非使用引用[2]中的方法添加标签,但用户的问题可能更关注纯图像按钮。 需要验证示例代码的正确性,比如lv_imgbtn_create的参数是否正确,是否应该用lv_scr_act()或者父对象。引用[3]中的普通按钮创建示例使用lv_btn_create(lv_scr_act(), NULL),所以图像按钮可能类似,使用lv_imgbtn_create(lv_scr_act(), NULL)。 另外,确保示例代码包含必要的回调函数设置,如引用[3]中的lv_obj_set_event_cb,但需要确认图像按钮是否使用相同的事件回调方式。是的,因为图像按钮也是继承自基本对象,所以事件回调设置方式相同。 最后,生成相关问题时,需要考虑用户可能的后续问题,比如不同状态图像的处理、如何添加标签、性能优化等,参考引用中的内容来设计相关问题。 现在,整合这些信息,编写步骤说明和示例代码,确保符合用户的要求,使用中文回答,并正确应用LaTeX格式,如行内公式用$...$,独立公式用$$...$$。但当前问题不涉及数学公式,所以可能不需要使用,但如果有变量或代码中的符号,按规则处理即可。 总结步骤: 1. 创建图像按钮对象。 2. 设置各状态图像源(释放、按下、禁用等)。 3. 调整位置和大小。 4. 设置事件回调函数。 5. 添加说明和注意事项,比如图像按钮不支持符号,需用图像源。 检查是否有遗漏,比如图像源的类型(如需要转换为lv_img_dsc_t),用户可能需要包含图像数据的定义示例,比如引用[3]中的图像对象。所以,在示例代码中可能需要包含图像变量的声明,如使用LV_IMG_DECLARE加载图片资源。 例如,假设用户需要将图片嵌入代码,可能需要使用LVGL的图像转换工具生成的C数组,所以在示例中添加LV_IMG_DECLARE(my_img_normal)等声明,并确保图像源正确设置。 最后,确保代码格式正确,使用反引号包裹代码块,语法正确,并参考用户提供的引用内容,确保信息准确。</think>以下为LVGL框架中图像按钮(lv_imgbtn)的使用方法和示例代码说明: ### 一、图像按钮核心使用方法 1. **创建图像按钮对象** ```c lv_obj_t *imgbtn = lv_imgbtn_create(lv_scr_act(), NULL); ``` 2. **设置状态图像源** ```c LV_IMG_DECLARE(img_normal); // 声明普通状态图像资源 LV_IMG_DECLARE(img_pressed); // 声明按下状态图像资源 lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_RELEASED, &img_normal); // 释放状态图像[^1] lv_imgbtn_set_sATE_PRESSED, &img_pressed); // 按下状态图像[^1] ``` 3. **设置位置和大小** ```c lv_obj_set_pos(imgbtn, 50, 50); // 设置坐标 lv_obj_set_size(imgbtn, 100, 40); // 设置尺寸 ``` 4. **事件回调配置** ```c lv_obj_set_event_cb(imgbtn, imgbtn_event_handler); // 绑定事件处理函数 static void imgbtn_event_handler(lv_obj_t *obj, lv_event_t event){ if(event == LV_EVENT_CLICKED) { // 处理点击事件 } } ``` ### 二、高级功能说明 1. **禁用状态支持** ```c LV_IMG_DECLARE(img_disabled); lv_imgbtn_set_src(imgbtn, LV_BTN_STATE_DISABLED, &img_disabled); // 禁用状态图像[^1] lv_obj_set_state(imgbtn, LV_STATE_DISABLED); // 进入禁用状态 ``` 2. **混合标签使用** ```c lv_obj_t *label = lv_label_create(imgbtn, NULL); lv_label_set_text(label, LV_SYMBOL_DUMMY "Text"); // 带图标的文字[^2] ``` ### 三、关键特性对比 | 功能特性 | 普通按钮(lv_btn) | 图像按钮(lv_imgbtn) | |----------------|------------------|---------------------| | 状态图像支持 | 仅颜色变化 | 多状态自定义图像[^1] | | 符号支持 | ✅ | ❌ [^1] | | 动态效果 | 内置动画 | 需手动实现 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值