[LVGL] 显示动画效果

首先找一个git动画文件 【转成逐帧png】,或者连续几张图片,然后在Online image converter - BMP, JPG or PNG to C array or binary | LVGL  网页上将图片转成C文件数组数据。

Lvgl_image_convert_tool: 基于LVGl图片转换离线版封装的小工具,不仅有界面,还可以一键生成到项目里哦 (gitee.com)

这里用经典的太空人gif图。 我提取了其中的7张图片转成文件 taikong_a1.c~~taikong_a7.c

将这些文件导入工程。在初始化的文件中添加代码  lvgl_v8.0+

#define MAX_IMGS_NUM  7 //定义动画帧的图片量
static const lv_img_dsc_t* my_anim_imgs[MAX_IMGS_NUM] =
{
    &taikong_a1,
    &taikong_a2,
    &taikong_a3,
    &taikong_a4,
    &taikong_a5,
    &taikong_a6,
    &taikong_a7
};

//方案1:初始化函数中调用 my_anim_imgs() 即可。
void astronauts_animing(void)
{

    lv_obj_t* animimg1 = lv_animimg_create(lv_scr_act()); //动画1
    lv_obj_center(animimg1); //居中
    lv_animimg_set_src(animimg1, (lv_img_decoder_t**)my_anim_imgs,MAX_IMGS_NUM  );
    lv_animimg_set_duration(animimg1,500);
    lv_animimg_set_repeat_count(animimg1,LV_ANIM_REPEAT_INFINITE);
    lv_animimg_start( animimg1 );
}

//方案2:
void loop_display()
{
    int index = 0;
    lv_obj_t* parent_obj = lv_scr_act();
    lv_obj_t* img_obj = lv_img_create(parent_obj);
    while(1)
    {
        lv_img_set_src(img_obj,my_anim_imgs[index]);
        lv_timer_handler();
        if(++index>MAX_IMGS_NUM)
        {
            index = 0;
            vTaskDelay(pdMS_TO_TICKS(1500));
        }
        else
            vTaskDelay(pdMS_TO_TICKS(100));
    }
}


//***************一些常用函数扩展:*****************//

//1)  弹出消息框,调用如lv_msgbox_show("TestMsg!")
 

static void msgbox_event_callback(lv_event_t* event)
{
    lv_event_code_t code = lv_event_get_code(event);
    lv_obj_t* msgbox = lv_event_get_current_target(event);

    if ((code == LV_EVENT_VALUE_CHANGED) && (msgbox != NULL))
    {
        const char* txt = lv_msgbox_get_active_btn_text(msgbox);
        if (strcmp(txt, "OK") == 0)
        {
            lv_msgbox_close(msgbox);
        }
    }
}


void lv_msgbox_show(char * msgStr )
{
    static const char* button_array[] = { "OK" };
    // 创建带按钮
    lv_obj_t* msg_box = lv_msgbox_create(NULL, "---------", msgStr, button_array, false);

    if (msg_box != NULL )
    {
        lv_obj_add_event_cb(msg_box, msgbox_event_callback, LV_EVENT_ALL, NULL);
        lv_obj_align(msg_box, LV_ALIGN_CENTER, 0, 0);
    }
}

2)在窗口顶部做Toast显示,调用 lv_toast_show("TestMsg!",true); 第二参数为是否需要长时间显示

void task_calcBox_cb(lv_timer_t* tmr)
{

   lv_obj_t* msg_box = (lv_obj_t*)tmr->user_data;
   if (msg_box == NULL)
   {
       return;
   }
   int leftCnt = tmr->repeat_count; 
   if ( leftCnt > 15)
   {   //when value<=15 start,for stop it
       return;
   }
   static int offsetPos = 10;
   lv_obj_align(msg_box, LV_ALIGN_TOP_MID, 0, offsetPos);

   offsetPos -= 5;
   if (leftCnt == 0)
   {
       lv_msgbox_close(msg_box);
       offsetPos = 10;//restore origin

   }

}

void lv_toast_show(char* msgStr,bool bStayLong)
{
    lv_obj_t* msg_box = lv_msgbox_create(NULL, "", msgStr, NULL, false);
    int cnt_times = 15;
    if (bStayLong)
        cnt_times = 30;


    if (msg_box != NULL)
    {
        lv_obj_align(msg_box, LV_ALIGN_TOP_MID, 0, 0);
        lv_timer_t* taskTimer = lv_timer_create(task_calcBox_cb, 100, msg_box);        
        lv_timer_set_repeat_count(taskTimer, cnt_times);//count_time set
       
    }
}

//---------------------------

void set_screen_bg_color(uint32_t bg_color)
{
    
   static lv_style_t style ; 
   static bool bFistInit = false;
   if( !bFistInit ){
      bFistInit = true;
     lv_style_init(&style);                          
    lv_obj_add_style(lv_scr_act(),&style,0);   
   }

   lv_style_set_bg_color(&style,lv_color_hex(bg_color) );    
   lv_obj_refresh_style(lv_scr_act(), &style, 0);
   
}

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
LVGL界面切换效果可以通过两种方法实现。方法一是切换到窗口2时,删除窗口1的容器,这样可以删除窗口1下的所有子对象。这种方式适用于运存较小的设备。方法二是在显示窗口1之前给窗口2的容器设置LV_OBJ_FLAG_HIDDEN隐藏属性,在显示窗口2之前给窗口1的容器设置LV_OBJ_FLAG_HIDDEN隐藏属性。这样可以通过控制容器的隐藏属性来实现窗口的切换效果。 利用LVGL提供的GUI Guider工具,可以轻松地创建高品质的显示界面,通过拖放编辑器和少量的代码即可利用LVGL的众多特性,如小部件、动画和样式来实现界面切换效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [LVGL8的窗口切换方式](https://blog.csdn.net/qq981378640/article/details/119959482)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [GUI Guider使用例程(应用LVGL的三个界面切换)](https://download.csdn.net/download/sinat_33408502/87505395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值