使用lvgl做表盘时,息屏之后过几秒钟点亮屏幕, 指针至少会一下跳动好几秒位置,怎么处理?给出案例
时间: 2024-03-08 16:50:06 浏览: 138
这个问题可能是因为LCD显示器被关闭,画面被冻结导致的。解决这个问题的方法是在唤醒时重新绘制屏幕。
以下是一个使用lvgl绘制表盘的示例代码,可以通过重新绘制来解决指针跳动的问题:
```c
#include "lvgl/lvgl.h"
lv_obj_t * hour_hand;
lv_obj_t * minute_hand;
lv_obj_t * second_hand;
void draw_watch_face(lv_obj_t * parent)
{
// 绘制表盘背景
lv_obj_t * watch_face = lv_obj_create(parent);
lv_obj_set_size(watch_face, LV_HOR_RES, LV_VER_RES);
lv_obj_set_style_local_bg_color(watch_face, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
// 绘制时针
hour_hand = lv_line_create(watch_face);
lv_line_set_points(hour_hand, 0, 0, 0, -60);
lv_obj_set_style_local_line_width(hour_hand, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 4);
lv_obj_set_style_local_line_color(hour_hand, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
lv_obj_set_pos(hour_hand, LV_HOR_RES / 2, LV_VER_RES / 2);
// 绘制分针
minute_hand = lv_line_create(watch_face);
lv_line_set_points(minute_hand, 0, 0, 0, -80);
lv_obj_set_style_local_line_width(minute_hand, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3);
lv_obj_set_style_local_line_color(minute_hand, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
lv_obj_set_pos(minute_hand, LV_HOR_RES / 2, LV_VER_RES / 2);
// 绘制秒针
second_hand = lv_line_create(watch_face);
lv_line_set_points(second_hand, 0, 0, 0, -100);
lv_obj_set_style_local_line_width(second_hand, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 2);
lv_obj_set_style_local_line_color(second_hand, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
lv_obj_set_pos(second_hand, LV_HOR_RES / 2, LV_VER_RES / 2);
}
void update_watch_hands()
{
// 获取当前时间
time_t raw_time;
struct tm * timeinfo;
time(&raw_time);
timeinfo = localtime(&raw_time);
// 设置时针位置
int hour_angle = (timeinfo->tm_hour % 12) * 30;
lv_obj_set_angle(hour_hand, hour_angle);
// 设置分针位置
int minute_angle = timeinfo->tm_min * 6;
lv_obj_set_angle(minute_hand, minute_angle);
// 设置秒针位置
int second_angle = timeinfo->tm_sec * 6;
lv_obj_set_angle(second_hand, second_angle);
}
void lv_watch_face_task()
{
draw_watch_face(lv_scr_act());
while(1)
{
update_watch_hands();
lv_task_handler(); // 处理 lvgl 任务
vTaskDelay(pdMS_TO_TICKS(1000)); // 每秒钟更新一次表盘
}
}
void lvgl_init()
{
lv_init();
// 创建驱动
lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.disp_flush = lvgl_flush;
lv_disp_drv_register(&disp_drv);
// 创建输入设备驱动
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read = lvgl_input_read;
lv_indev_drv_register(&indev_drv);
}
int main()
{
lvgl_init();
xTaskCreate(lv_watch_face_task, "lv_watch_face_task", 2048, NULL, 1, NULL);
vTaskStartScheduler();
return 0;
}
```
在这个示例中,我们使用了lvgl库绘制了一个表盘,包括时针, 分针和秒针。在 `update_watch_hands` 函数中,我们获取当前时间,并根据时间设置指针的位置。在 `lv_watch_face_task` 任务中,我们使用一个while循环来更新表盘,并且每秒钟更新一次表盘。这样,在屏幕唤醒时,重新绘制表盘,就可以解决指针跳动的问题。
阅读全文