LVGL slider添加图片

void myUiInit(void)
{
    // 创建一个水平滑动条
    lv_obj_t * ui_Indicator_Right = lv_slider_create(lv_scr_act());
    // 设置滑动条的范围
    lv_slider_set_range(ui_Indicator_Right, 0, 29);
    // 设置滑动条的初始值
    lv_slider_set_value(ui_Indicator_Right, 25, LV_ANIM_OFF);
    // 如果滑动条的模式是范围模式,则设置左值
    if (lv_slider_get_mode(ui_Indicator_Right) == LV_SLIDER_MODE_RANGE) lv_slider_set_left_value(ui_Indicator_Right, 0,LV_ANIM_OFF);
    // 设置滑动条的宽度
    lv_obj_set_width(ui_Indicator_Right, 33);
    // 设置滑动条的高度
    lv_obj_set_height(ui_Indicator_Right, 289);
    // 设置滑动条的对齐方式
    lv_obj_set_align(ui_Indicator_Right, LV_ALIGN_CENTER);
    // 设置滑动条的主要部分的圆角
    lv_obj_set_style_radius(ui_Indicator_Right, 4, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的背景颜色
    lv_obj_set_style_bg_color(ui_Indicator_Right, lv_color_hex(0x272A33), LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的背景透明度
    lv_obj_set_style_bg_opa(ui_Indicator_Right, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的背景主停止点
    lv_obj_set_style_bg_main_stop(ui_Indicator_Right, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的背景渐变停止点
    lv_obj_set_style_bg_grad_stop(ui_Indicator_Right, 255, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的边框宽度
    lv_obj_set_style_border_width(ui_Indicator_Right, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的左边距
    lv_obj_set_style_pad_left(ui_Indicator_Right, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的右边距
    lv_obj_set_style_pad_right(ui_Indicator_Right, 2, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的上边距
    lv_obj_set_style_pad_top(ui_Indicator_Right, 0, LV_PART_MAIN | LV_STATE_DEFAULT);
    // 设置滑动条的主要部分的下边距
    lv_obj_set_style_pad_bottom(ui_Indicator_Right, 0, LV_PART_MAIN | LV_STATE_DEFAULT);

    // 设置滑动条指示器的圆角
    lv_obj_set_style_radius(ui_Indicator_Right, 4, LV_PART_INDICATOR | LV_STATE_DEFAULT);
    // 设置滑动条指示器的背景颜色
    lv_obj_set_style_bg_color(ui_Indicator_Right, lv_color_hex(0xFFFFFF), LV_PART_INDICATOR | LV_STATE_DEFAULT);
    // 设置滑动条指示器的背景透明度
    lv_obj_set_style_bg_opa(ui_Indicator_Right, 0, LV_PART_INDICATOR | LV_STATE_DEFAULT);
    // 设置滑动条指示器的背景主停止点
    lv_obj_set_style_bg_main_stop(ui_Indicator_Right, 0, LV_PART_INDICATOR | LV_STATE_DEFAULT);
    // 设置滑动条指示器的背景渐变停止点
    lv_obj_set_style_bg_grad_stop(ui_Indicator_Right, 255, LV_PART_INDICATOR | LV_STATE_DEFAULT);
    // 设置滑动条指示器的背景图片
    lv_obj_set_style_bg_img_src(ui_Indicator_Right, &indicator_ver, LV_PART_INDICATOR | LV_STATE_DEFAULT);

    // 设置滑动条旋钮的背景颜色
    lv_obj_set_style_bg_color(ui_Indicator_Right, lv_color_hex(0xFFFFFF), LV_PART_KNOB | LV_STATE_DEFAULT);
    // 设置滑动条旋钮的背景透明度
    lv_obj_set_style_bg_opa(ui_Indicator_Right, 0, LV_PART_KNOB | LV_STATE_DEFAULT);

}

现象:

<think>我们参考用户的需求:在LVGL 8.2中实现多图片滑动切换功能。 根据引用[2]中提到的`lv_tileview`,它正是用于创建可滑动切换的网格布局(每个网格称为一个tile)。我们可以利用`lv_tileview`来实现图片的滑动切换。 实现步骤: 1. 创建Tileview对象 2. 添加多个Tile(每个Tile对应一张图片) 3. 在每个Tile中添加图片对象 4. 设置Tileview的滑动方向和每个Tile的滑动方向(通常允许左右或上下滑动) 注意:每个Tile实际上是一个容器,我们可以在其中放置任意对象(如图片、标签等)。 具体代码实现如下:</think>### LVGL 8.2 多图片滑动切换实现方案 在 LVGL 8.2 中实现多图片滑动切换功能,推荐使用 **`lv_tileview` 组件**(如引用[2]所述)。这是一个专为滑动界面设计的容器对象,特别适合图片滑动场景。以下是完整实现方案: #### 核心实现步骤 ```c // 1. 创建Tileview对象 lv_obj_t *tileview = lv_tileview_create(lv_scr_act()); // 2. 设置滑动方向(水平/垂直) lv_obj_set_scroll_dir(tileview, LV_DIR_HORIZONTAL); // LV_DIR_VERTICAL // 3. 添加多个图片瓦片(tile) for(int i = 0; i < IMAGE_COUNT; i++) { // 创建瓦片容器 lv_obj_t *tile = lv_tileview_add_tile(tileview, i, 0, LV_DIR_HORIZONTAL); // 在瓦片中创建图片 lv_obj_t *img = lv_img_create(tile); LV_IMG_DECLARE(my_image[i]); // 声明图片资源 lv_img_set_src(img, &my_image[i]); // 设置图片源 // 图片居中显示 lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); // 可选:添加图片效果(如引用[1]) lv_img_set_zoom(img, 256); // 缩放 lv_obj_set_style_img_recolor(img, lv_color_hex(0xffe1d2), 0); // 着色 } // 4. 设置初始显示位置 lv_tileview_set_tile(tileview, 0, 0, LV_ANIM_OFF); ``` #### 高级功能扩展 1. **添加滑动指示器** ```c lv_obj_t *tv_indicator = lv_obj_create(lv_scr_act()); lv_obj_set_size(tv_indicator, 100, 5); lv_obj_align(tv_indicator, LV_ALIGN_BOTTOM_MID, 0, -20); // 监听滑动事件更新指示器位置 lv_obj_add_event_cb(tileview, [](lv_event_t *e) { lv_point_t tile_pos; lv_tileview_get_tile_act(tileview, &tile_pos); lv_obj_set_x(tv_indicator, tile_pos.x * (100/IMAGE_COUNT)); }, LV_EVENT_VALUE_CHANGED, NULL); ``` 2. **添加过渡动画**(如引用[3]) ```c // 创建动画样式 static lv_style_t style_anim; lv_style_init(&style_anim); lv_style_set_anim_time(&style_anim, 300); // 300ms过渡时间 lv_style_set_anim_path(&style_anim, &lv_anim_path_ease_out); // 应用动画到图片 lv_obj_add_style(img, &style_anim, LV_STATE_DEFAULT); ``` 3. **自定义滑动行为** ```c // 限制滑动边界(防止滑动到空白区域) lv_obj_set_scroll_snap_x(tileview, LV_SCROLL_SNAP_CENTER); // 禁用特定方向滑动 lv_tileview_set_tile(tileview, 1, 0, LV_DIR_RIGHT); // 只能向左滑 ``` #### 完整示例(3张图片滑动) ```c void create_image_slider() { // 创建Tileview lv_obj_t *tileview = lv_tileview_create(lv_scr_act()); lv_obj_set_size(tileview, 320, 240); lv_obj_set_scroll_dir(tileview, LV_DIR_HORIZONTAL); // 声明图片资源 LV_IMG_DECLARE(img1); LV_IMG_DECLARE(img2); LV_IMG_DECLARE(img3); lv_img_dsc_t *images[] = {&img1, &img2, &img3}; // 添加图片瓦片 for(int i=0; i<3; i++) { lv_obj_t *tile = lv_tileview_add_tile(tileview, i, 0, LV_DIR_HORIZONTAL); lv_obj_t *img = lv_img_create(tile); lv_img_set_src(img, images[i]); lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); // 添加缩放动画 lv_img_set_zoom(img, 220); } // 设置初始位置 lv_tileview_set_tile(tileview, 0, 0, LV_ANIM_ON); } ``` #### 关键特性说明 1. **滑动机制** - 内置惯性滚动和边界回弹效果 - 支持滑动位置对齐(居中/吸附) - 可通过 `lv_tileview_set_edge_flash(tileview, true)` 添加边缘闪光效果 2. **性能优化** ```c // 预加载相邻图片(减少切换延迟) lv_tileview_set_preload(tileview, 1); // 预加载左右相邻 // 使用缓存图片(避免重复解码) lv_img_cache_set_size(3); // 缓存3张图片 ``` 3. **事件处理** ```c // 监听滑动结束事件 lv_obj_add_event_cb(tileview, [](lv_event_t *e) { lv_point_t pos; lv_tileview_get_tile_act(tileview, &pos); LV_LOG("切换到图片 %d", pos.x); }, LV_EVENT_VALUE_CHANGED, NULL); ``` #### 效果验证 1. 左右滑动切换图片(带惯性效果) 2. 滑动到边界自动回弹 3. 图片切换时有平滑过渡 4. 指示器实时显示当前位置 > **提示**:对于复杂场景,可结合 `lv_page` 实现嵌套滑动,或使用 `lv_anim` 创建自定义切换动画[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值