第十八章 开关部件(lv_switch)
在GUI界面中,我们经常用到开关部件,它就相当于一个当前值只有0和1的滑块部件。
本章节将分为以下几个小节:
18.1 开关部件的组成
18.2 开关部件的相关知识
18.3 开关部件的API函数
18.4 开关部件的实验
18.1 开关部件的组成
开关部件由三个部分组成:主体背景、指示器和旋钮,示意图如下:

图18.1.1 开关部件组成部分
各组成部分的相关枚举如下所示:
① 主体背景LV_PART_MAIN;
② 指示器LV_PART_INDICATOR;
③ 旋钮LV_PART_KNOB。
关于部件样式设置的内容,请大家参考6.4.4章节。
18.2 开关部件的相关知识
18.2.1 获取开关部件状态
用户可调用lv_obj_has_state函数获取开关的当前状态,示例如下:
lv_obj_has_state(switch1, LV_STATE_CHECKED); /* 返回true:开启状态 */
在上述函数中,我们判断开关是否为开启状态,如果已经开启,则返回true,否则返回false;
18.2.2 设置开关部件的状态
在默认情况下,开关创建出来之后,其是关闭的状态,如果用户需要添加开关的状态,可调用以下函数(用于打开开关):
lv_obj_add_state(switch1, LV_STATE_CHECKED);
在上述函数中,我们将开关设置为开启的状态。
如果用户想清除开关的状态,可调用以下函数(用于关闭开关):
lv_obj_clear_state(switch1, LV_STATE_CHECKED);
注意:当开关状态发生变化时,其触发的事件类型是LV_EVENT_VALUE_CHANGED。
18.3 开关部件的API函数
lv_switch_create函数
创建开关部件,该函数原型如下所示:
lv_obj_t *lv_switch_create(lv_obj_t *parent);
该函数的形参,如表18.3.2所示:

表18.3.2 lv_switch_create函数形参描述
返回值:指向开关部件的指针。
18.4 开关部件的实验
18.4.1 硬件设计
1. 例程功能
本实验主要测试开关部件API函数的使用,实验现象:开机后,屏幕上显示一个开关,用户可以通过KEY2来切换开关的状态。与此同时,LED0闪烁,提示系统正在运行。
该实验的完整源码,请参考《LVGL例程15 lv_switch(开关)》例程,路径:A盘→4,程序源码 →3,扩展例程 →3,LVGL例程。
18.4.2 软件设计
18.4.2.1 程序流程图
本实验的程序流程图,如下图18.4.2.1.1所示:

图18.4.2.1.1 开关部件实验流程图
18.4.2.2 程序解析
关于LVGL的用户代码,我们都是在lv_mainstart.c文件中编写的,本实验的源码如下所示:
/**************************** 第一部分 开始 ****************************/
/**
* @brief LVGL演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
lv_example_switch(); /* 开关 */
}
/**************************** 第一部分 结束 ****************************/
/**************************** 第二部分 开始 ****************************/
/**
* @brief 开关示例
* @param 无
* @return 无
*/
static void lv_example_switch(void)
{
/* 创建“组” */
lv_group_t *g = lv_group_create();
lv_indev_set_group(indev_keypad, g);
/* 标签 */
lv_obj_t *label_cool = lv_label_create(lv_scr_act()); /* 创建标签 */
lv_label_set_text(label_cool, "Cool"); /* 设置文本内容 */
/* 设置字体 */
lv_obj_set_style_text_font(label_cool, &lv_font_montserrat_32, 0);
lv_obj_align(label_cool, LV_ALIGN_CENTER, 0, -30 ); /* 设置位置 */
/* 开关 */
lv_obj_t *switch_cool = lv_switch_create(lv_scr_act()); /* 创建开关 */
lv_obj_set_size(switch_cool,80, 40 ); /* 设置大小 */
lv_obj_align(switch_cool, LV_ALIGN_CENTER, 0, 20 ); /* 设置位置 */
lv_group_add_obj(g, switch_cool); /* 添加到组 */
}
/**************************** 第二部分 结束 ****************************/
上述源码可分为以下两个部分:
① lv_mainstart接口函数。在该函数中,我们调用了标签部件和开关部件相关的示例函数;
② 开关功能的实现。
18.4.3 下载验证
把工程编译并下载到我们的开发板中,运行效果如图18.4.3.1所示:

图18.4.3.1 开关部件实验
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3173589/ ,如需转载,请注明出处,否则将追究法律责任。