25. 平铺视图部件

一、平铺视图部件

  平铺视图部件 常用于多页面的切换,它的每一个页面就相当于一个容器,用户可以往里面装入自己需要的内容(例如其他的部件),与选项卡视图部件不同的是,它是通过滑动的形式切换页面的,并没有按钮矩阵。平铺视图部件的组成部分只有一个:主体容器(lv_obj),示意图如下所示:

平铺视图部件的组成

  上图中,每一个 Tile 即一个容器(页面),在正常显示的情况下,只有一个页面可见,其它的页面为隐藏状态,用户可以通过滑动屏幕来切换页面。

  LVGL 官方提供了一些与平铺视图部件相关 API。

lv_obj_t * lv_tileview_create(lv_obj_t * parent);               // 创建平铺视图部件

lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir);                   // 添加页面

#define lv_obj_set_tile                      lv_tileview_set_tile
void lv_tileview_set_tile(lv_obj_t * obj, lv_obj_t * tile_obj, lv_anim_enable_t anim_en);                       // 根据容器切换页面

#define lv_obj_set_tile_id                   lv_tileview_set_tile_by_index
void lv_tileview_set_tile_by_index(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en);  // 根据坐标切换页面

#define lv_tileview_get_tile_act             lv_tileview_get_tile_active
lv_obj_t * lv_tileview_get_tile_active(lv_obj_t * obj);         // 获取当前的页面

  用户需要 创建平铺视图部件,可调用 lv_tileview_create() 函数。

/**
 * @brief 创建平铺视图部件
 * 
 * @param parent 指向父部件的指针
 * @return lv_obj_t* 指向平铺视图部件的指针
 */
lv_obj_t * lv_tileview_create(lv_obj_t * parent);

  在默认情况下,该部件被创建出来后并没有任何页面。需要往平铺视图部件中添加页面,可以调用 lv_tileview_add_tile () 函数进行设置。当用户添加完页面之后,将会得到指向该页面的容器的指针,我们可以在该容器中添加自己所需的内容。

/**
 * @brief 添加页面
 * 
 * @param tv 指向视图平铺部件的指针
 * @param col_id 列ID
 * @param row_id 行ID
 * @param dir 滑动方向
 * @return lv_obj_t* 指向页面容器的指针
 */
lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, lv_dir_t dir);

  该滑动方向的可选参数如下所示:

enum _lv_dir_t {
    LV_DIR_NONE     = 0x00,
    LV_DIR_LEFT     = (1 << 0),                         // 往左滑动
    LV_DIR_RIGHT    = (1 << 1),                         // 往右滑动
    LV_DIR_TOP      = (1 << 2),                         // 往上滑动
    LV_DIR_BOTTOM   = (1 << 3),                         // 往下滑动
    LV_DIR_HOR      = LV_DIR_LEFT | LV_DIR_RIGHT,       // 水平滑动
    LV_DIR_VER      = LV_DIR_TOP | LV_DIR_BOTTOM,       // 垂直滑动
    LV_DIR_ALL      = LV_DIR_HOR | LV_DIR_VER,          // 全部方向
};

需要实现页面的切换,则至少要添加两个页面,且合理设置页面切换的方向。

  切换页面的方法有两种:触摸滑动调用页面切换函数。页面切换相关的函数如下所示:

/**
 * @brief 根据容器切换页面
 * 
 * @param obj 指向平铺视图部件的指针
 * @param tile_obj 指向要切换容器部件的指针
 * @param anim_en 是否开启动画
 */
void lv_obj_set_tile(lv_obj_t * obj, lv_obj_t * tile_obj, lv_anim_enable_t anim_en);
/**
 * @brief 根据页面的坐标进行切换
 * 
 * @param tv 指向平铺视图部件的指针
 * @param col_id 要切换的容器部件的列坐标
 * @param row_id 要切换的容器部件的行坐标
 * @param anim_en 是否开启动画
 */
void lv_obj_set_tile_id(lv_obj_t * tv, uint32_t col_id, uint32_t row_id, lv_anim_enable_t anim_en);  // 根据坐标切换页面

二、实验例程

#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"

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

    // 测试代码
    lv_obj_t *tileView = lv_tileview_create(lv_scr_act());                      // 创建平铺视图部件
    lv_obj_center(tileView);                                                    // 平铺视图部件居中显示

    lv_obj_t *tile1 = lv_tileview_add_tile(tileView, 0, 0, LV_DIR_RIGHT);       // 添加页面
    lv_obj_t *label1 = lv_label_create(tile1);
    lv_obj_set_style_text_font(label1, &lv_font_montserrat_30, LV_PART_MAIN);
    lv_label_set_text(label1, "Hello World!");
    lv_obj_center(label1);

    lv_obj_t *tile2 = lv_tileview_add_tile(tileView, 1, 0, LV_DIR_LEFT);        // 添加页面
    lv_obj_t *label2 = lv_label_create(tile2);
    lv_obj_set_style_text_font(label2, &lv_font_montserrat_30, LV_PART_MAIN);
    lv_label_set_text(label2, "Hello Sakura!");
    lv_obj_center(label2);

    lv_obj_update_layout(tileView);                                             // 更新布局

    lv_tileview_set_tile(tileView, tile2, LV_ANIM_ON);                          // 设置当前显示页面

    while (1)
    {
        lv_timer_handler();
        Delay_ms(5);
    }
  
    return 0;
}
posted @ 2024-08-13 22:21  星光映梦  阅读(45)  评论(0编辑  收藏  举报