LVGL9 开关控件 (lv_switch) 使用指南

文章目录

    • 前言
    • 主体
      • [1. **控件概述**](#1. 控件概述)
      • [2. **控件的样式和组成部分**](#2. 控件的样式和组成部分)
      • [3. **使用控件**](#3. 使用控件)
      • [4. **事件处理**](#4. 事件处理)
      • [5. **按键支持**](#5. 按键支持)
      • [6. **示例代码**](#6. 示例代码)
    • 总结

前言

lv_switch 是 LittlevGL 提供的一个开关控件,外观类似一个小型滑块,常用于实现开关功能,用来开启或关闭某项功能。通过其灵活的样式和交互特性,lv_switch 在 UI 开发中非常实用。


主体

1. 控件概述

lv_switch 是一种交互控件,通常表示一个二元状态:开启或关闭。它的外观基于滑块设计,用户可以通过拖动或点击控件来改变其状态。


2. 控件的样式和组成部分

lv_switch 的样式分为以下部分:

  • LV_PART_MAIN :控件的背景区域。支持所有典型的背景样式属性,如颜色、圆角和边框。padding 属性可以调整背景区域的大小。

  • LV_PART_INDICATOR:指示当前状态的滑块条。支持背景样式属性,例如改变颜色以表示"开启"或"关闭"状态。

  • LV_PART_KNOB :滑块的圆形或矩形按钮,位于滑块条的左侧或右侧。支持背景样式属性,包括大小、形状和边距。默认情况下,旋钮的尺寸与滑块的较小一侧相等,可以通过 padding 调整其大小和位置。

开发者可以通过这些样式自定义控件的外观,例如改变滑块的颜色或按钮的形状。


3. 使用控件

改变开关状态

lv_switch 使用标准的 LV_STATE_CHECKED 状态来表示开关的开启状态。以下是状态的相关操作:

  • 获取当前状态 :

    使用以下函数检查开关是否开启(true 表示开启):

    c 复制代码
    bool is_checked = lv_obj_has_state(switch_obj, LV_STATE_CHECKED);
  • 开启开关 :

    使用以下函数手动开启开关:

    c 复制代码
    lv_obj_add_state(switch_obj, LV_STATE_CHECKED);
  • 关闭开关 :

    使用以下函数手动关闭开关:

    c 复制代码
    lv_obj_remove_state(switch_obj, LV_STATE_CHECKED);

4. 事件处理

lv_switch 提供了一个事件来响应状态变化:

  • LV_EVENT_VALUE_CHANGED:当开关的状态改变时触发该事件。可以通过事件回调函数获取状态变化信息。

示例代码:

c 复制代码
void switch_event_cb(lv_event_t * e) {
    lv_obj_t * obj = lv_event_get_target(e);
    bool is_on = lv_obj_has_state(obj, LV_STATE_CHECKED);
    if (is_on) {
        printf("Switch is ON\n");
    } else {
        printf("Switch is OFF\n");
    }
}

// 注册事件
lv_obj_add_event_cb(switch_obj, switch_event_cb, LV_EVENT_VALUE_CHANGED, NULL);

5. 按键支持

lv_switch 提供以下按键操作:

  • LV_KEY_UP/RIGHT:开启开关。
  • LV_KEY_DOWN/LEFT:关闭开关。
  • LV_KEY_ENTER:切换开关状态(开启或关闭)。

6. 示例代码

以下示例展示了如何创建一个开关控件并监听其状态变化:

c 复制代码
void create_switch_example() {
    // 创建一个开关控件
    lv_obj_t * switch_obj = lv_switch_create(lv_scr_act());

    // 设置开关的位置
    lv_obj_align(switch_obj, LV_ALIGN_CENTER, 0, 0);

    // 添加状态改变事件回调
    lv_obj_add_event_cb(switch_obj, switch_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
}

void switch_event_cb(lv_event_t * e) {
    lv_obj_t * obj = lv_event_get_target(e);
    if (lv_obj_has_state(obj, LV_STATE_CHECKED)) {
        printf("Switch is ON\n");
    } else {
        printf("Switch is OFF\n");
    }
}

总结

lv_switch 是一个直观且功能强大的开关控件,适用于需要二元状态切换的场景。通过灵活的样式和简单的事件处理,开发者可以轻松地将其集成到 UI 中,为用户提供友好的交互体验。

相关推荐
Sakura_j_h_22 分钟前
EasyEDA PCB 快速设计Skills
c++·python·github
碧海银沙音频科技研究院28 分钟前
基于炬芯ATS308X 设计的上位机usb 串口音乐EQ调节工具
stm32·单片机·嵌入式硬件
钱工的门窗技术笔记33 分钟前
室内极窄全景移门的支承路径与预留接口:轨道形式、型材壁厚口径与验收边界
物联网·架构·数据分析
Binovate缤江数智1 小时前
水泵远程开关之后,还需要管什么?数智开关在无人值守泵站中的监测、保护与能耗分析
人工智能·物联网
程序喵大人1 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
BJ_Bonree2 小时前
博睿数据亮相第41届BFSI IT Summit Thailand
大数据·人工智能·物联网
jimy13 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
三佛科技-134163842124 小时前
过认证72W碳化硅方案(12V6A)主控HN1562+HN36228V 典型应用电路、变压器参数分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
Zwawa5 小时前
串口为什么会丢字节:从轮询到中断和环形缓冲区
c语言·单片机·嵌入式
Brilliantwxx5 小时前
【STM32】 内部 Flash 详解:寄存器逐位拆解 + 工作流程顺序全讲 + EEPROM再实现
stm32·单片机·嵌入式硬件·1024程序员节