LVGL_按钮部件(LV_btn)

在实际的 LVGL项目工程中,按钮部件的使用频率是非常高的,它常用于控制设备的启停。
在 LVGL中,当按钮部件被创建出来之后,其默认是一个圆角矩形,较为遗憾的是,按钮部件
并不能直接设置文本。
本章节将分为以下几个小节:
12.1 按钮部件的组成
12.2 按钮部件的相关知识
12.3 按钮部件的 API 函数
12.4 按钮部件的实验
12.1****按钮部件的组成
按钮部件(lv_btn)仅有一个组成部分:主体背景,示意图如下:

12.2****按钮部件的相关知识

按钮部件和基础对象非常类似,它们的绝大部分知识都是通用的,这里我们只介绍它们之
间的区别:
① 默认情况下,按钮部件不可滚动。
② 默认情况下,按钮部件已经添加到默认组中。
③ 按钮部件的默认宽高为 LV_SIZE_CONTENT(自适应)。

12.3按钮部件的API****函数

lv_btn_create****函数
创建按钮对象,其函数原型如下所示:

lv_obj_t * lv_btn_create ( lv_obj_t *parent);
parent 部件的父类
**返回值:**返回对象控制块。

设置按钮大小

我们可以通过屏幕的大小来进行按钮大小的设计

获取当前屏幕大小

/* 获取当前活动屏幕的宽高 */

#define scr_act_width() lv_obj_get_width(lv_scr_act())

#define scr_act_height() lv_obj_get_height(lv_scr_act())

创建一个按钮

btn_next = lv_btn_create(lv_scr_act()); /* 创建加速按钮 */
lv_obj_set_size(btn_next, scr_act_width() / 4, scr_act_height() / 6); /* 设置按钮大小 */
lv_obj_align(btn_next, LV_ALIGN_CENTER, -scr_act_width() / 3, 0); /* 设置按钮位置 */
lv_obj_add_event_cb(btn_next, btn_event_cb, LV_EVENT_CLICKED, NULL); /* 设置按钮事件 */

设置按钮背景颜色

/* 设置按钮背景颜色(默认) */
lv_obj_set_style_bg_color(btn_stop_run, lv_color_hex(0xef5f60),
LV_STATE_DEFAULT);
/* 设置按钮背景颜色(按下) */
lv_obj_set_style_bg_color(btn_stop_run, lv_color_hex(0xff0000),
LV_STATE_PRESSED);

设置按钮事件

lv_obj_add_event_cb(btn_stop_run, btn_event_cb, LV_EVENT_CLICKED, NULL);

设置按钮标签

设置标签需要开启LVGL字库,并且进行设置,具体实现看总代码。

lv_obj_t* label = lv_label_create(btn_stop_run); /* 创建急停按钮标签 */

lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置字体 */

lv_label_set_text(label, "Stop"); /* 设置标签文本 */

lv_obj_set_align(label,LV_ALIGN_CENTER); /* 设置标签位置 */

总代码

复制代码
/**
* @brief LVGL 演示
* @param 无
* @return 无
*/
void lv_mainstart(void)
{
 lv_example_label(); /* 速度提示标签 */
 lv_example_btn_up(); /* 加速按钮 */
 lv_example_btn_down(); /* 减速按钮 */
 lv_example_btn_stop(); /* 急停按钮 */
}
/**************************** 第一部分 结束 ****************************/
/**************************** 第二部分 开始 ****************************/
/**
* @brief 速度值提示标签
* @param 无
* @return 无
*/
static void lv_example_label(void)
{
 /* 根据活动屏幕宽度选择字体 */
 if (scr_act_width() <= 320)
 {
 font = &lv_font_montserrat_10;
 }
 else if (scr_act_width() <= 480)
 {
 font = &lv_font_montserrat_14;
 }
 else
 {
 font = &lv_font_montserrat_20;
 }
 label_speed = lv_label_create(lv_scr_act()); /* 创建速度显示标签 */
 lv_obj_set_style_text_font(label_speed, font, LV_PART_MAIN); /* 设置字体 */
lv_label_set_text(label_speed, "Speed : 0 RPM"); /* 设置文本 */
/* 设置标签位置 */
 lv_obj_align(label_speed, LV_ALIGN_CENTER, 0, -scr_act_height() / 3); 
}
/**************************** 第二部分 结束 ****************************/
/**************************** 第三部分 开始 ****************************/
/**
* @brief 按钮回调
* @param *e :事件相关参数的集合,它包含了该事件的所有数据
* @return 无
*/
static void btn_event_cb(lv_event_t * e)
{
 lv_obj_t *target = lv_event_get_target(e); /* 获取触发源 */
 if(target == btn_speed_up) /* 加速按钮 */
 {
 speed_val += 30;
 }
 else if(target == btn_speed_down) /* 减速按钮 */
 {
 speed_val -= 30;
 }
 else if(target == btn_stop) /* 急停按钮 */
 {
 speed_val = 0;
}
/* 更新速度值 */
 lv_label_set_text_fmt(label_speed, "Speed : %d RPM", speed_val); 
}
/**
* @brief 加速按钮
* @param 无
* @return 无
*/
static void lv_example_btn_up(void)
{
/* 创建加速按钮 */
btn_speed_up = lv_btn_create(lv_scr_act());
/* 设置按钮大小 */
lv_obj_set_size(btn_speed_up, scr_act_width() / 4, scr_act_height() / 6);
/* 设置按钮位置 */
lv_obj_align(btn_speed_up, LV_ALIGN_CENTER, -scr_act_width() / 3, 0); 
/* 设置按钮事件 */
 lv_obj_add_event_cb(btn_speed_up, btn_event_cb, LV_EVENT_CLICKED, NULL);
 lv_obj_t* label = lv_label_create(btn_speed_up); /* 创建加速按钮标签 */
 lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置字体 */
 lv_label_set_text(label, "Speed +"); /* 设置标签文本 */
 lv_obj_set_align(label,LV_ALIGN_CENTER); /* 设置标签位置 */
}
/**
* @brief 减速按钮
* @param 无
* @return 无
*/
static void lv_example_btn_down(void)
{
/* 创建加速按钮 */
btn_speed_down = lv_btn_create(lv_scr_act()); 
/* 设置按钮大小 */
lv_obj_set_size(btn_speed_down, scr_act_width() / 4, scr_act_height() / 6);
/* 设置按钮位置 */
lv_obj_align(btn_speed_down, LV_ALIGN_CENTER, 0, 0); 
/* 设置按钮事件 */
 lv_obj_add_event_cb(btn_speed_down, btn_event_cb, LV_EVENT_CLICKED, NULL);
 lv_obj_t* label = lv_label_create(btn_speed_down); /* 创建减速按钮标签 */
 lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置字体 */
 lv_label_set_text(label, "Speed -"); /* 设置标签文本 */
 lv_obj_set_align(label,LV_ALIGN_CENTER); /* 设置标签位置 */
}
/**
* @brief 急停按钮
* @param 无
* @return 无
*/
static void lv_example_btn_stop(void)
{
/* 创建急停按钮 */
btn_stop = lv_btn_create(lv_scr_act());
/* 设置按钮大小 */ 
lv_obj_set_size(btn_stop, scr_act_width() / 4, scr_act_height() / 6); 
/* 设置按钮位置 */
lv_obj_align(btn_stop, LV_ALIGN_CENTER, scr_act_width() / 3, 0); 
/* 设置按钮背景颜色(默认) */
 lv_obj_set_style_bg_color(btn_stop, lv_color_hex(0xef5f60),
LV_STATE_DEFAULT);
 /* 设置按钮背景颜色(按下) */
 lv_obj_set_style_bg_color(btn_stop, lv_color_hex(0xff0000),
LV_STATE_PRESSED);
 /* 设置按钮事件 */
 lv_obj_add_event_cb(btn_stop, btn_event_cb, LV_EVENT_CLICKED, NULL); 
 lv_obj_t* label = lv_label_create(btn_stop); /* 创建急停按钮标签 */
 lv_obj_set_style_text_font(label, font, LV_PART_MAIN); /* 设置字体 */
 lv_label_set_text(label, "Stop"); /* 设置标签文本 */
 lv_obj_set_align(label,LV_ALIGN_CENTER); /* 设置标签位置 */
}
/**************************** 第三部分 结束 ****************************/
相关推荐
iCxhust14 小时前
Keil µVision 调试指南---UART#1 模拟/调试窗口 完全使用教程
stm32·单片机·嵌入式硬件
iCxhust14 小时前
51单片机引脚 ALE EA PSEN的用途
单片机·嵌入式硬件·51单片机
碎像14 小时前
51单片机创建项目
单片机·嵌入式硬件·51单片机
木白CPP14 小时前
MCU 进程内存布局详解(.text, .rodata, .data, .bss, 堆, 栈)
单片机·嵌入式硬件
風清掦15 小时前
【江科大STM32学习笔记-10】I2C通信协议 - 10.2 硬件 I2C 读写MPU6050
笔记·stm32·单片机·嵌入式硬件·学习
ALINX技术博客15 小时前
【黑金云课堂】FPGA技术教程Vitis开发:RTC中断讲解
单片机·嵌入式硬件·fpga开发
进击的小头15 小时前
第10篇:嵌入式芯片中断系统详解:NVIC与硬实时性优化设计
单片机·嵌入式硬件
菠萝地亚狂想曲16 小时前
Zephyr_02,SEM
单片机
天狼IoT16 小时前
STM32-keil+CubeMX快速开发【外设配置篇】:NVIC与中断通用处理方法
stm32·单片机·嵌入式硬件
llilian_1617 小时前
国产铷原子钟 铷频标挑选指南 铷原子频标 国产铷钟
大数据·网络·功能测试·单片机·嵌入式硬件·测试工具