LVGL ----Slider 滑动条控件

#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);
}

// Slider滑动条控件事件回调函数
static void slider_event_cb(lv_obj_t * slider, lv_event_t e)
{
if(e == LV_EVENT_VALUE_CHANGED) { // 捕获值改变事件
if(lv_slider_get_type(slider) == LV_SLIDER_TYPE_NORMAL) { // 滑动条正常模式
static char buf[16];
lv_snprintf(buf, sizeof(buf), “%d”, lv_slider_get_value(slider)); // 获取控件当前的值封装成字符串
lv_obj_set_style_local_value_str(slider, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, buf);// 设置显示控件值
} else { // 滑动条范围模式
static char buf[32];
// 获取控件左值和右值
lv_snprintf(buf, sizeof(buf), “%d-%d”, lv_slider_get_left_value(slider), lv_slider_get_value(slider));
lv_obj_set_style_local_value_str(slider, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, buf);// 设置显示控件值
}
}
}

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));

///////////////////////////////////////////////////
///////////////Slider 滑动条控件////////////////////
///////////////////////////////////////////////////
lv_obj_t * slider1 = lv_slider_create(lv_scr_act(), NULL);		// 在屏幕上创建一个滑动条控件
lv_slider_set_value(slider1, 40, LV_ANIM_OFF);					// 设置当前值,动画模式关闭
lv_obj_set_event_cb(slider1, slider_event_cb);					// 设置控件事件回调函数
lv_obj_set_width(slider1, 300);									// 设置控件宽度
lv_slider_set_type(slider1, LV_SLIDER_TYPE_NORMAL);				// 模式正常模式
lv_slider_set_range(slider1,0,100);								// 设置值范围,默认0-100
lv_obj_align(slider1, NULL, LV_ALIGN_CENTER, 0, 60);			// 对齐到屏幕中心偏上

// 使用滑动条旋钮样式创建本地风格,拖动时显示,当控件失去焦点时动态消失的动画效果
lv_obj_set_style_local_margin_top(slider1, LV_SLIDER_PART_BG, LV_STATE_DEFAULT, LV_DPX(25));		// 相对顶距离
lv_obj_set_style_local_value_font(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, lv_theme_get_font_small());// 小字体
lv_obj_set_style_local_value_ofs_y(slider1, LV_SLIDER_PART_KNOB, LV_STATE_FOCUSED, - LV_DPX(25));// Y轴偏移,向下消失动画
lv_obj_set_style_local_value_opa(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_OPA_TRANSP);// 默认透明
lv_obj_set_style_local_value_opa(slider1, LV_SLIDER_PART_KNOB, LV_STATE_FOCUSED, LV_OPA_COVER);// 获得焦点时不透明
lv_obj_set_style_local_transition_time(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, 300);// 转换时长
lv_obj_set_style_local_transition_prop_5(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_STYLE_VALUE_OFS_Y);// 添加Y轴偏移
lv_obj_set_style_local_transition_prop_6(slider1, LV_SLIDER_PART_KNOB, LV_STATE_DEFAULT, LV_STYLE_VALUE_OPA);// 添加透明度

lv_obj_t * slider2 = lv_slider_create(lv_scr_act(), slider1);	// 继承slider1设置在屏幕上创建slider2
lv_slider_set_type(slider2, LV_SLIDER_TYPE_RANGE);				// 模式设置为范围模式,关闭动画模式
lv_slider_set_value(slider2, 70, LV_ANIM_OFF);					// 设置当前值为70,关闭动画模式
lv_slider_set_left_value(slider2, 30, LV_ANIM_OFF);				// 设置当前左边值为30,关闭动画模式
lv_obj_set_style_local_value_ofs_y(slider2, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, - LV_DPX(25));// Y轴偏移
lv_obj_set_style_local_value_font(slider2, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, lv_theme_get_font_small());// 小字体
lv_obj_set_style_local_value_opa(slider2, LV_SLIDER_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_COVER);// 不透明
lv_obj_set_event_cb(slider2, slider_event_cb);					// 设置事件回调函数
lv_event_send(slider2, LV_EVENT_VALUE_CHANGED, NULL);			// 发送事件:值改变
lv_obj_set_width(slider2, 300);									// 设置控件宽度
lv_obj_align(slider1, NULL, LV_ALIGN_CENTER, 0, -60);			// 对齐到屏幕中心偏下

// lv_demo_widgets();

while (1) {
	vTaskDelay(1);
	// 尝试锁定信号量,如果成功,调用处理LVGL任务
	if (xSemaphoreTake(xGuiSemaphore, (TickType_t)10) == pdTRUE) {
		lv_task_handler();					// 处理LVGL任务
		xSemaphoreGive(xGuiSemaphore);		// 释放信号量
	}
}
vTaskDelete(NULL);							// 删除任务

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44799641

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值