15. 微调器部件
一、微调器部件
微调器部件本质上就是一个文本区域部件,它只不过在后者的基础上做了一些延伸。微调器主要用于精确调节某个参数值。
LVGL 官方提供了一些与微调器部件相关 API。
lv_obj_t * lv_spinbox_create(lv_obj_t * parent); // 创建微调器部件
void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos); // 设置数值格式
void lv_spinbox_set_value(lv_obj_t * obj, int32_t v); // 设置微调器部件的数值
int32_t lv_spinbox_get_value(lv_obj_t * obj); // 获取当前值
void lv_spinbox_set_rollover(lv_obj_t * obj, bool rollover); // 设置翻转
bool lv_spinbox_get_rollover(lv_obj_t * obj); // 获取翻转状态
void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step); // 设置步长
int32_t lv_spinbox_get_step(lv_obj_t * obj); // 获取步长
void lv_spinbox_step_next(lv_obj_t * obj); // 将步进除以10,选择下一个较低的数字
void lv_spinbox_step_prev(lv_obj_t * obj); // 将步进乘以10,选择下一个更高的数字
void lv_spinbox_increment(lv_obj_t * obj); // 数值自增
void lv_spinbox_decrement(lv_obj_t * obj); // 数值自减
void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max); // 设置范围
void lv_spinbox_set_cursor_pos(lv_obj_t * obj, uint32_t pos); // 设置光标位置
void lv_spinbox_set_digit_step_direction(lv_obj_t * obj, lv_dir_t direction); // 根据编码器数值设置数字步长方向
我们可以使用 lv_spinbox_create()
函数 创建微调器对象。
/**
* @brief 创建微调器部件
*
* @param parent 指向父部件的指针
* @return lv_obj_t* 指向微调器部件的指针
*/
lv_obj_t * lv_spinbox_create(lv_obj_t * parent);
在默认情况下,微调器部件被创建出来,只能显示 5 位数,且没有小数点。如果用户 需要设置总的位数和小数点,可以调用以下函数:
/**
* @brief 设置数值格式
*
* @param obj 指向微调器部件的指针
* @param digit_count 总的位数,不包括小数点分隔符和符号
* @param sep_pos 小数点前的位数。如果为 0,则不显示小数点
*/
void lv_spinbox_set_digit_format(lv_obj_t * obj, uint32_t digit_count, uint32_t sep_pos);
在微调器部件中,小数点仅仅是“装饰”,它并不会改变最终的数值,例如:微调器部件上面显示 55.211,而我们获取它的当前数值,得到的将会是 55211。
创建完微调器部件之后,我们还可以使用 lv_spinbox_set_range()
函数 设置数值范围。
/**
* @brief 设置范围
*
* @param obj 指向微调器部件的指针
* @param range_min 最小值
* @param range_max 最大值
*/
void lv_spinbox_set_range(lv_obj_t * obj, int32_t range_min, int32_t range_max);
在 LVGL 中,微调器部件默认的步长为 1,如果我们要修改步长,可以调用 lv_spinbox_set_step()
函数 设置步长。
/**
* @brief 设置步长
*
* @param obj 指向微调器部件的指针
* @param step 步长
*/
void lv_spinbox_set_step(lv_obj_t * obj, uint32_t step);
二、实验例程
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"
lv_obj_t *label;
lv_obj_t *spinBox;
lv_obj_t * increse_button;
lv_obj_t * decrese_button;
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_align(label, LV_ALIGN_TOP_MID); // 设置标签部件顶部居中对齐
lv_obj_set_style_text_font(label, &lv_font_montserrat_30, LV_PART_MAIN); // 设置标签部件的字体样式
lv_label_set_text(label, "spinBox test"); // 设置标签部件的文本
spinBox = lv_spinbox_create(lv_scr_act()); // 创建微调器部件
lv_obj_center(spinBox); // 微调器部件居中对齐
lv_obj_set_size(spinBox, 230, 50); // 设置微调器部件的尺寸
lv_obj_set_style_text_font(spinBox, &lv_font_montserrat_30, LV_PART_MAIN); // 设置微调器部件的字体样式
lv_spinbox_set_range(spinBox, -100, 100); // 设置范围值
lv_spinbox_set_digit_format(spinBox, 4, 0); // 设置显示格式
lv_spinbox_set_step(spinBox, 10); // 设置步进值
lv_spinbox_set_value(spinBox, 10); // 设置当前值
increse_button = lv_btn_create(lv_scr_act()); // 创建递增按钮
lv_obj_align_to(increse_button, spinBox, LV_ALIGN_OUT_RIGHT_TOP, 0, 0);
lv_obj_set_height(increse_button, 23);
lv_obj_add_event_cb(increse_button, spinBox_button_event_cb, LV_EVENT_CLICKED, NULL);
decrese_button = lv_btn_create(lv_scr_act()); // 创建递增按钮
lv_obj_align_to(decrese_button, spinBox, LV_ALIGN_OUT_RIGHT_BOTTOM, 0, 0);
lv_obj_set_height(decrese_button, 23);
lv_obj_add_event_cb(decrese_button, spinBox_button_event_cb, LV_EVENT_CLICKED, NULL);
while (1)
{
lv_timer_handler();
Delay_ms(5);
}
return 0;
}
void spinBox_button_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); // 获取事件的触发源
uint32_t value = 0;
if (code == LV_EVENT_CLICKED)
{
if (target == increse_button)
{
lv_spinbox_increment(spinBox);
}
else if (target == decrese_button)
{
lv_spinbox_decrement(spinBox);
}
value = lv_spinbox_get_value(spinBox);
lv_label_set_text_fmt(label, "value %ld", value);
}
}