LVLG ----Spinbox 微调控件
#define TAG " LittlevGL Demo"
#define LV_TICK_PERIOD_MS 10
SemaphoreHandle_t xGuiSemaphore; // 创建一个GUI信号量
static void lv_tick_task(void *arg); // LVGL 时钟任务
void guiTask(void *pvParameter); // GUI任务
// LVGL 时钟任务
static void lv_tick_task(void *arg) {
(void) arg;
lv_tick_inc(LV_TICK_PERIOD_MS);
}
// 控件定义在外面,因为回调函数中需要调用
static lv_obj_t * spinbox;
// Spinbox 微调控件:递增事件处理回调函数
static void lv_spinbox_increment_event_cb(lv_obj_t * btn, lv_event_t e)
{
// 这里捕获长按和短按是为了短按增加一个数,长按信不松手不停增加
if(e == LV_EVENT_SHORT_CLICKED || e == LV_EVENT_LONG_PRESSED_REPEAT) {// 捕获短按和长按事件
lv_spinbox_increment(spinbox);// 递增控件中的值
}
}
// Spinbox 微调控件:递减事件处理回调函数
static void lv_spinbox_decrement_event_cb(lv_obj_t * btn, lv_event_t e)
{
// 这里捕获长按和短按是为了短按减少一个数,长按信不松手不停减少
if(e == LV_EVENT_SHORT_CLICKED || e == LV_EVENT_LONG_PRESSED_REPEAT) {// 捕获短按和长按事件
lv_spinbox_decrement(spinbox);// 递减控件中的值
}
}
void guiTask(void *pvParameter) {
(void) pvParameter;
xGuiSemaphore = xSemaphoreCreateMutex(); // 创建GUI信号量
lv_init(); // 初始化LittlevGL
lvgl_driver_init(); // 初始化液晶SPI驱动 触摸芯片SPI/IIC驱动
// 初始化缓存
static lv_color_t buf1[DISP_BUF_SIZE];
static lv_color_t buf2[DISP_BUF_SIZE];
static lv_disp_buf_t disp_buf;
uint32_t size_in_px = DISP_BUF_SIZE;
lv_disp_buf_init(&disp_buf, buf1, buf2, size_in_px);
// 添加并注册触摸驱动
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.flush_cb = disp_driver_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);
// 添加并注册触摸驱动
ESP_LOGI(TAG,"Add Register Touch Drv");
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.read_cb = touch_driver_read;
indev_drv.type = LV_INDEV_TYPE_POINTER;
lv_indev_drv_register(&indev_drv);
// 定期处理GUI回调
const esp_timer_create_args_t periodic_timer_args = {
.callback = &lv_tick_task,
.name = "periodic_gui"
};
esp_timer_handle_t periodic_timer;
ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, LV_TICK_PERIOD_MS * 1000));
///////////////////////////////////////////////////
///////////////Spinbox 微调控件////////////////////
///////////////////////////////////////////////////
spinbox = lv_spinbox_create(lv_scr_act(), NULL); // 在主屏幕上创建一个微调控件
lv_spinbox_set_range(spinbox, -1000, 90000); // 设置微调控件的值范围,可以是负数,这里的数字并不是真的,要根据下面的数字格式
lv_spinbox_set_digit_format(spinbox, 5, 2); // 设置数字的格式,5代表5位不足前面补0,2代表小数点前面有2位
lv_spinbox_set_value(spinbox,1000); // 设置初始值1.000
lv_spinbox_set_step(spinbox, 2); // 设置步进为2,单击+-增加减少2
lv_spinbox_step_prev(spinbox); // 通过乘以10选择上一个较高的数字,就是光标向左移一位
lv_spinbox_step_prev(spinbox); // 通过乘以10选择上一个较高的数字
//lv_spinbox_step_next(spinbox); // 通过除以10选择下一个较低的数字,就是光标向右移一位
lv_obj_set_width(spinbox, 100); // 设置控件宽度
lv_obj_align(spinbox, NULL, LV_ALIGN_CENTER, 0, 0); // 对齐到屏幕中心
lv_coord_t h = lv_obj_get_height(spinbox); // 获取微调控件的高度
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL); // 创建一个按钮
lv_obj_set_size(btn, h, h); // 设置宽度高度和微调控件的高度一致
lv_obj_align(btn, spinbox, LV_ALIGN_OUT_RIGHT_MID, 5, 0); // 对齐到微调控件的右边再偏移5
lv_theme_apply(btn, LV_THEME_SPINBOX_BTN); // 按钮样式设置为微调按钮风格
lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_SYMBOL_PLUS); // 本地显示值为+号
lv_obj_set_event_cb(btn, lv_spinbox_increment_event_cb); // 添加按钮事件回调函数
btn = lv_btn_create(lv_scr_act(), btn); // 继承上面按钮再创建一个按钮
lv_obj_align(btn, spinbox, LV_ALIGN_OUT_LEFT_MID, -5, 0); // 对齐到微调控件的左边偏移5
lv_obj_set_event_cb(btn, lv_spinbox_decrement_event_cb); // 添加按钮事件回调函数
lv_obj_set_style_local_value_str(btn, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_SYMBOL_MINUS);// 本地显示值为-号
// lv_demo_widgets();
while (1) {
vTaskDelay(1);
// 尝试锁定信号量,如果成功,调用处理LVGL任务
if (xSemaphoreTake(xGuiSemaphore, (TickType_t)10) == pdTRUE) {
lv_task_handler(); // 处理LVGL任务
xSemaphoreGive(xGuiSemaphore); // 释放信号量
}
}
vTaskDelete(NULL); // 删除任务
}
更多推荐
所有评论(0)