30. 日历部件
一、日历部件
日历部件可以展现当前的日期,并帮助用户快速浏览每月的日程安排。日历部件由两个部分组成:主体背景(LV_PART_MAIN
)和 各个按钮(LV_PART_ITEMS
)。
LVGL 官方提供了一些与日历部件相关 API。
lv_obj_t * lv_calendar_create(lv_obj_t * parent); // 创建日历部件
void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day); // 设置当前的日期
const lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * obj); // 获取当前的日期
void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month); // 设置显示的日期
const lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * obj); // 获取当前显示的日期
void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num); // 设置高亮显示的日期
lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * obj); // 获取高亮显示的日期
size_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * obj); // 获取高亮显示的日期数量
void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]); // 设置日历(星期)的名称
lv_obj_t * lv_calendar_get_btnmatrix(const lv_obj_t * obj); // 获取日历的按钮矩阵对象
lv_result_t lv_calendar_get_pressed_date(const lv_obj_t * obj, lv_calendar_date_t * date); // 获取当前按下的日期
lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent); // 创建带有下拉框的日历头
lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent); // 创建带有头部箭头的日历头
在 LVGL 中,用户需要 创建日历部件,可调用 lv_calendar_create()
函数:
/**
* @brief 创建日历部件
*
* @param parent 指向父部件的指针
* @return lv_obj_t* 指向日历部件的指针
*/
lv_obj_t * lv_calendar_create(lv_obj_t * parent);
在默认的情况下,当用户创建出一个日历部件,如果用户需要设置日期,则可以调用 lv_calendar_set_today_date()
函数。
/**
* @brief 设置当前的日期
*
* @param obj 指向日历控件的指针
* @param year 年
* @param month 月
* @param day 日
*/
void lv_calendar_set_today_date(lv_obj_t * obj, uint32_t year, uint32_t month, uint32_t day);
注意:当前日期并不等同于实时显示的日期。
如果我们仅仅是设置了当前日期,日期部件并不会自动显示该日期,所以我们必须手动跳转当前日期对应的月份,相关的函数为 lv_calendar_set_shown_date()
。
/**
* @brief 设置显示的日期
*
* @param obj 指向日历控件的指针
* @param year 年
* @param month 月
*/
void lv_calendar_set_showed_date(lv_obj_t * obj, uint32_t year, uint32_t month);
我们可以调用 lv_calendar_header_dropdown_create()
函数设置日历头,它是由下拉列表的形式来选择年月份。
/**
* @brief 创建带有下拉框的日历头
*
* @param parent 指向日历部件的指针
* @return lv_obj_t* 返回日历头的指针
*/
lv_obj_t * lv_calendar_header_dropdown_create(lv_obj_t * parent);
我们还可以调用 lv_calendar_header_dropdown_create()
函数设置日历头,它可以通过头部的箭头按键调节年月份。
/**
* @brief 创建带有头部箭头的日历头
*
* @param parent 指向日历部件的指针
* @return lv_obj_t* 指向日历头的指针
*/
lv_obj_t * lv_calendar_header_arrow_create(lv_obj_t * parent);
如果用户需要某个日期高亮显示,可调用 lv_calendar_set_highlighted_dates()
函数来进行设置。
/**
* @brief 设置高亮显示的日期
*
* @param obj 指向日历部件的指针
* @param highlighted 年
* @param date_num 月
*/
void lv_calendar_set_highlighted_dates(lv_obj_t * obj, lv_calendar_date_t highlighted[], size_t date_num);
在默认的情况下,日历都是以英文的形式展示(Su、Mo、Tu、We、Th、Fr 和 Sa),如果用户想设置成中文的日名,可调用 lv_calendar_set_day_names()
函数。
/**
* @brief 设置日历(星期)的名称
*
* @param obj 指向日历部件的指针
* @param day_names 指向存放名称的数组指针
*/
void lv_calendar_set_day_names(lv_obj_t * obj, const char * day_names[]);
二、实验例程
#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"
int main(void)
{
static lv_calendar_date_t highlighted[2];
const char* day_names[7] = {"7", "1", "2", "3", "4", "5", "6"};
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 *calender = lv_calendar_create(lv_scr_act()); // 创建日历部件
lv_obj_center(calender); // 设置日历部件居中对齐
lv_obj_set_size(calender, 300, 300);
lv_calendar_set_today_date(calender, 2024, 3, 1); // 设置当前日期
lv_calendar_set_showed_date(calender, 2024, 3); // 设置显示的日期
lv_calendar_header_arrow_create(calender); // 创建日历头
highlighted[0].year = 2024;
highlighted[0].month = 3;
highlighted[0].day = 5;
highlighted[1].year = 2024;
highlighted[1].month = 3;
highlighted[1].day = 7;
lv_calendar_set_highlighted_dates(calender, highlighted, 2); // 设置高亮日期
lv_calendar_set_day_names(calender, day_names); // 设置日名
while (1)
{
lv_timer_handler();
Delay_ms(5);
}
return 0;
}