立即注册 找回密码

微雪课堂

搜索

树莓派littlevGL系列教程:事件

2019-12-26 20:45| 发布者: imliubo| 查看: 7316| 评论: 0|原作者: IAMLIUBO

摘要: Hi,大家好,欢迎来到树莓派之littlevGL课堂,本节课带大家简单分析一下littleVGL的事件处理机制!一 什么是事件关于事件,我们已经在前面的控件学习阶段使用过很多了,比如我们第一次接触事件应该是单按钮控件那一 ...
Hi,大家好,欢迎来到树莓派之littlevGL课堂,本节课带大家简单分析一下littleVGL的事件处理机制!
一 什么是事件
关于事件,我们已经在前面的控件学习阶段使用过很多了,比如我们第一次接触事件应该是单按钮控件那一节课,我们创建了一个事件回调函数用来响应按键的触发,没错,这就是我们第一次接触littleVGL的事件,当然后面还有很多控件都有使用过,但是没有仔细的去分析一下,这里带大家简单分析一下!

二 事件类型
事件可以分为下面几大类:
一般事件
  • 输入设备有关事件
    • LV_EVENT_PRESSED 该对象已被按下
  • LV_EVENT_PRESSING 对象被按下(在按下时连续发送)
  • LV_EVENT_PRESS_LOST 仍在按下输入设备,但不再在对象上
  • LV_EVENT_SHORT_CLICKED 在LV_INDEV_LONG_PRESS_TIME时间之前发布事件,如果拖动则不调用。
  • LV_EVENT_LONG_PRESSED  按下LV_INDEV_LONG_PRESS_TIME时间后发布事件,如果拖动则不调用。
  • LV_EVENT_LONG_PRESSED_REPEAT 按下LV_INDEV_LONG_PRESS_TIME时间后,LV_INDEV_LONG_PRESS_REP_TIME毫秒调用一次,如果拖动则不调用。
  • LV_EVENT_CLICKED 如果未拖动则调用释放(无论长按)
  • LV_EVENT_RELEASED  在每种情况下都被调用,即使对象已被拖动也被释放。如果在按下并从对象外部释放时从对象上滑出,则不会调用,在这种情况下,LV_EVENT_PRESS_LOST发送。
  • 指针设备有关事件
  • LV_EVENT_DRAG_BEGIN 开始拖动对象
  • LV_EVENT_DRAG_END 拖动完成(包括拖动)
  • LV_EVENT_DRAG_THROW_BEGIN 开始拖动(在拖动带有“动量”之后释放)
  • 键盘和编码器有关事件
  • LV_EVENT_KEY 将密钥发送到对象。通常在按下或长按后重复
  • LV_EVENT_FOCUSED 对象集中在其组中
  • LV_EVENT_DEFOCUSED 对象在其组中散焦
  • 通用事件
    • LV_EVENT_DELETE 删除对象。释放相关的用户分配数据。
特殊事件(仅适用于特定的对象类型)
  • LV_EVENT_VALUE_CHANGED 对象值已更改(例如,对于Slider)
  • LV_EVENT_INSERT 东西插入到对象中。(通常到文本区域)
  • LV_EVENT_APPLY 单击 “确定”,“应用”或类似的特定按钮。(通常来自键盘对象)
  • LV_EVENT_CANCEL 单击 “关闭”,“取消”或类似的特定按钮。(通常来自键盘对象)
  • LV_EVENT_REFRESH 查询以刷新对象。永远不会由库发送,但可以由用户发送。
三 事件回调函数
我们在上面看到有这么多的事件类型,是不是感觉有点难呢?其实我们平常开发中不会用到这么多的,也就是使用几个比较常见的,那我们再来温习一下事件回调函数的使用,首先你还是得创建一个控件对象,然后使用下面的函数绑定控件与事件回调函数,相信大家都还记得:
lv_obj_set_event_cb(btn, my_event_cb);   /*Assign an event callback*/
然后我们只需要在事件回调函数里处理控件发过来的事件类型就好了,就像下面那样:
static void my_event_cb(lv_obj_t * obj, lv_event_t event)
{
    switch(event) {
        case LV_EVENT_PRESSED:
            printf("Pressed\n");
            break;

        case LV_EVENT_SHORT_CLICKED:
            printf("Short clicked\n");
            break;

        case LV_EVENT_CLICKED:
            printf("Clicked\n");
            break;

        case LV_EVENT_LONG_PRESSED:
            printf("Long press\n");
            break;

        case LV_EVENT_LONG_PRESSED_REPEAT:
            printf("Long press repeat\n");
            break;

        case LV_EVENT_RELEASED:
            printf("Released\n");
            break;
    }

       /*Etc.*/
}
当然上面只是一个简单的例子,就跟我们前面学习按钮控件的时候差不多,当然这里只是简单跟大家看一下处理方式。
四 事件的触发方式
事件的触发是有两种方式的,一种是控件的自动触发,比如你按下按钮后的自动触发,这是一种方式,不过这种方式比较被动。
还有一种方式就是我们可以手动触发,就是我们可以通过函数去触发事件回调,那么怎么做呢,其实就是很简单:
lv_event_send(label, LV_EVENT_VALUE_CHANGED, NULL);
其中第一个参数就是我们的控件,然后第二个参数就是我们想要触发的事件类型,也就是上面我们的列出来的那些事件类型。

OK,这就是关于事件的一些知识点,大家有没有学会呢?

324

顶一下

刚表态过的朋友 (324 人)

相关阅读

最新评论

Arduino
基础入门
OpenCV
littleGL

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-12-22 13:09 , Processed in 0.051384 second(s), 35 queries .