07. 开关部件
一、开关部件
开关部件 由三个部分组成:主体背景(LV_PART_MAIN
)、指示器(LV_PART_INDICATOR
)和 旋钮(LV_PART_KNOB
),示意图如下:
用户可以通过 lv_switch_create()
函数来 创建开关部件。
/**
* @brief 创建开关部件
*
* @param parent 指向父部件的指针
* @return lv_obj_t* 指向开关部件的指针
*/
lv_obj_t * lv_switch_create(lv_obj_t * parent);
在创建开关部件后,我们可以通过 lv_obj_has_state()
函数 获取开关的当前状态。
/**
* @brief 获取部件的状态
*
* @param obj 指向部件的指针
* @param state 要检查的状态
* @return true 表示部件已经开启
* @return false 表示部件已经关闭
*/
bool lv_obj_has_state(const lv_obj_t * obj, lv_state_t state);
在默认情况下,开关创建出来之后,其是关闭的状态,如果用户需要添加开关的状态,可调用以下函数(用于打开开关)。
/**
* @brief 设置部件的状态
*
* @param obj 指向部件的指针
* @param state 要设置的状态
*/
void lv_obj_add_state(lv_obj_t * obj, lv_state_t state);
如果用户想清除开关的状态,可调用以下函数(用于关闭开关)。
#define lv_obj_clear_state lv_obj_remove_state
void lv_obj_remove_state(lv_obj_t * obj, lv_state_t state);
当开关状态发生变化时,其触发的事件类型是 LV_EVENT_VALUE_CHANGED。
二、实验例程
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"
lv_obj_t *label;
int main(void)
{
HAL_Init();
System_Clock_Init(8, 336, 2, 7);
Delay_Init(168);
SPI_Simulate_Init();
// SRAM_Init();
TIM_Base_Init(&g_tim6_handle, TIM6, 83, 999);
__HAL_TIM_CLEAR_IT(&g_tim6_handle, TIM_IT_UPDATE); // 清除更新中断标志位
HAL_TIM_Base_Start_IT(&g_tim6_handle); // 使能更新中断,并启动计数器
lv_init();
lv_port_disp_init();
lv_port_indev_init();
// 测试代码
label = lv_label_create(lv_scr_act()); // 创建标签部件
lv_obj_set_style_text_font(label, &lv_font_montserrat_30, LV_PART_MAIN); // 设置标签部件的字体样式
lv_obj_set_align(label, LV_ALIGN_TOP_MID); // 设置标签部件靠上居中对齐
lv_label_set_text(label, "button test"); // 设置标签部件的文本内容
lv_obj_t *switch1 = lv_switch_create(lv_scr_act()); // 创建开关部件
lv_obj_set_align(switch1, LV_ALIGN_CENTER); // 设置开关部件的居中对齐
lv_obj_set_size(switch1, 100, 50);
lv_obj_set_style_bg_color(switch1, lv_color_hex(0xFF1493), LV_PART_MAIN); // 设置开关部件的主体的背景颜色
lv_obj_set_style_bg_color(switch1, lv_color_hex(0x9370DB), LV_STATE_CHECKED | LV_PART_INDICATOR); // 设置开关部件的指示器的背景颜色
lv_obj_set_style_bg_color(switch1, lv_color_hex(0x00F5FF), LV_PART_KNOB); // 设置开关部件的指示器的旋钮颜色
lv_obj_add_state(switch1, LV_STATE_CHECKED); // 设置开关部件的开关状态为打开
lv_obj_add_event_cb(switch1, switch_event_cb, LV_EVENT_VALUE_CHANGED, NULL); // 注册开关部件的状态改变时的事件回调函数
while (1)
{
lv_timer_handler();
Delay_ms(5);
}
return 0;
}
void switch_event_cb(lv_event_t *e)
{
lv_event_code_t code = lv_event_get_code(e); // 获取事件的触发类型
lv_obj_t *target = lv_event_get_target(e); // 获取事件的触发源
if (code == LV_EVENT_VALUE_CHANGED)
{
if (lv_obj_has_state(target, LV_STATE_CHECKED))
{
lv_label_set_text(label, "switch on");
}
else
{
lv_label_set_text(label, "switch off");
}
}
}