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);
    }
}
posted @ 2024-06-21 22:15  星光映梦  阅读(17)  评论(0编辑  收藏  举报