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");
        }
    }
}
posted @ 2024-05-09 21:12  星光映梦  阅读(14)  评论(0编辑  收藏  举报