LVGL 8.2 meter控件实现模拟时钟

133 篇文章 112 订阅

动画回调函数

static lv_obj_t* meter;
static void set_value(void* indic, int32_t v)
{
    lv_meter_set_indicator_end_value(meter, indic, v); // 设置分针值
}
static void set_hour_value(void* indic, int32_t v)
{
    if (v == 0)
        v = 12;
    lv_meter_set_indicator_end_value(meter, indic, v);   // 设置时针值
}

clock from a meter

static void lv_example_meter_3(void)
{
    meter = lv_meter_create(lv_scr_act());
    lv_obj_set_size(meter, 220, 220);
    lv_obj_center(meter);

    lv_obj_remove_style(meter, NULL, LV_PART_TICKS);
    lv_obj_remove_style(meter, NULL, LV_PART_ITEMS);
    /*Create a scale for the minutes*/
    /*61 ticks in a 360 degrees range (the last and the first line overlaps)*/
    lv_meter_scale_t* scale_min = lv_meter_add_scale(meter);
    lv_meter_set_scale_ticks(meter, scale_min, 61, 1, 10, lv_palette_main(LV_PALETTE_GREY));
    lv_meter_set_scale_range(meter, scale_min, 0, 60, 360, 270);
    /*Create another scale for the hours. It's only visual and contains only major ticks*/
    lv_meter_scale_t* scale_hour = lv_meter_add_scale(meter);
    lv_meter_set_scale_ticks(meter, scale_hour, 12, 0, 0, lv_palette_main(LV_PALETTE_GREY)); /*12 ticks*/
    lv_meter_set_scale_major_ticks(meter, scale_hour, 1, 2, 20, lv_color_black(), 10); /*Every tick is major*/
        lv_meter_set_scale_range(meter, scale_hour, 1, 12, 330, 300); /*[1..12] values in an almost full circle*/
    LV_IMG_DECLARE(img_hand)  // 表针图片资源声明
        /*Add a the hands from images*/
        lv_meter_indicator_t* indic_min = lv_meter_add_needle_img(meter, scale_min, &img_hand, 5, 5); // 
    lv_meter_indicator_t* indic_hour = lv_meter_add_needle_img(meter, scale_hour, &img_hand, 5, 5);
    /*Create an animation to set the value*/
    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_exec_cb(&a, set_value);
    lv_anim_set_values(&a, 0, 60);
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
    lv_anim_set_time(&a, 2000); /*2 sec for 1 turn of the minute hand (1 hour)*/
    lv_anim_set_var(&a, indic_min);
    lv_anim_start(&a);

    lv_anim_t a1;
    lv_anim_init(&a1);
    lv_anim_set_exec_cb(&a1, set_hour_value);
    lv_anim_set_repeat_count(&a1, LV_ANIM_REPEAT_INFINITE);
    lv_anim_set_var(&a1, indic_hour);
    lv_anim_set_time(&a1, 24000); /*24 sec for 1 turn of the hour hand*/
    lv_anim_set_values(&a1, 0, 12);
    lv_anim_start(&a1);
}

运行效果

在这里插入图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个问题可能是因为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循环来更新表盘,并且每秒钟更新一次表盘。这样,在屏幕唤醒时,重新绘制表盘,就可以解决指针跳动的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值