一、概述
1.1 Button 简介
按钮源自 lv_cont 容器,是简单的矩形对象,也是比较常见的控件。
二、Button 基础知识
2.1 Button 状态
- LV_BTN_STATE_RELEASED : 按钮的正常释放状态
- LV_BTN_STATE_PRESSED : 按钮的正常按下状态
- LV_BTN_STATE_CHECKED_RELEASED : 按钮的切换释放状态
- LV_BTN_STATE_CHECKED_PRESSED : 按钮的切换按下状态
- LV_BTN_STATE_DISABLED : 按钮的禁用无效状态
- LV_BTN_STATE_CHECKED_DISABLED : 按钮的切换禁用状态
我们可以调用 lv_btn_get_state(btn) 来获取按钮的状态,返回值为以上之一,如果需要更精确的状态描述(例如聚焦),可以使用 obj 通用函数 lv_obj_get_state(btn)。手动更改按钮的状态可以通过调用函数 lv_btn_set_state(btn, LV_BTN_STATE_…) 实现。
2.2 Button 是否可切换( Checkable )
可以使用 lv_btn_set_checkable(btn, true) 将按钮配置为切换按钮,在这种情况下,单击时,按钮自动转到 LV_STATE_CHECKED 状态,或者再次单击时返回原状态。
(1)这里的切换类似于 toggle 取反,比如,默认按键(非切换按键)的点击过程按键状态是这样的:
默认 ( LV_BTN_STATE_RELEASED ) -> 按下 ( LV_BTN_STATE_PRESSED ) -> 松开( LV_BTN_STATE_RELEASED )
(2)若给此按键启用切换状态,则按键的点击过程按键状态是这样的:
① 起始状态为正常态,即 LV_BTN_STATE_RELEASED
默认 ( LV_BTN_STATE_RELEASED ) -> 按下 ( LV_BTN_STATE_PRESSED ) -> 松开 ( LV_BTN_STATE_CHECKED_RELEASED )
② 起始状态为起始状态为切换态,即LV_BTN_STATE_CHECKED_RELEASED
默认 ( LV_BTN_STATE_CHECKED_RELEASED) -> 按下 ( LV_BTN_STATE_CHECKED_PRESSED ) -> 松开( LV_BTN_STATE_RELEASED )
2.3 Events 事件
除了通用事件,还有特殊事件 LV_EVENT_VALUE_CHANGED 是由按钮发送的。
- LV_EVENT_PRESSED : 对象已按下
- LV_EVENT_SHORT_CLICKED : 短的点击
- LV_EVENT_CLICKED : 点击
- LV_EVENT_LONG_PRESSED : 长按
- LV_EVENT_LONG_PRESSED_REPEAT : 重复长按
- LV_EVENT_RELEASED : 释放
- LV_EVENT_VALUE_CHANGED : 值改变
三、Button 应用
#include "../../../lv_examples.h"
#include
#if LV_USE_BTN
static void event_handler(lv_obj_t * obj, lv_event_t event)
{
if(event == LV_EVENT_CLICKED)
{
printf("Clicked\n");
}
else if(event == LV_EVENT_VALUE_CHANGED)
{
printf("Toggled\n");
}
}
void lv_ex_btn_1(void)
{
lv_obj_t * label;
lv_obj_t * btn1 = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn1, event_handler);
lv_obj_align(btn1, NULL, LV_ALIGN_CENTER, 0, -40);
label = lv_label_create(btn1, NULL);
lv_label_set_text(label, "Button");
lv_obj_t * btn2 = lv_btn_create(lv_scr_act(), NULL);
lv_obj_set_event_cb(btn2, event_handler);
lv_obj_align(btn2, NULL, LV_ALIGN_CENTER, 0, 40);
lv_btn_set_checkable(btn2, true);
lv_btn_toggle(btn2);
lv_btn_set_fit2(btn2, LV_FIT_NONE, LV_FIT_TIGHT);
label = lv_label_create(btn2, NULL);
lv_label_set_text(label, "Toggled");
}
#endif
Button 的简单应用如上,运行效果如下图所示,也可以去 LVGL 官网看看: https://lvgl.io/
图 1. 按键应用
四、参考资料
(1)LVGL 官方文档 :
https://docs.lvgl.io/7.11/overview/object.html
(2)正点原子 手把手教你学 LittleVGL :
http://www.openedv.com/docs/book-videos/zdyzshipin/4free/littleVGL.html