LVGL学习——动画重复播放,回放

主要函数

 /** 当前进方向准备就绪时,制作要播放的动画

 * Make the animation to play back to when the forward direction is ready
 * @param a         pointer to an initialized `lv_anim_t` variable
 * @param delay     delay in milliseconds before starting the playback animation.重放动画

static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay)
 */

 /** 当前进方向准备就绪时,制作要播放的动画

 * Make the animation to play back to when the forward direction is ready
 * @param a         pointer to an initialized `lv_anim_t` variable
 * @param delay     delay in milliseconds before starting the playback animation.重放动画

static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay)
 */

/**
 * Make the animation repeat itself.
 * @param a         pointer to an initialized `lv_anim_t` variable
 * @param cnt       repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition.

static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint16_t cnt)
 */
 

static void anim_x_cb(void * var, int32_t v)
{
    lv_obj_set_x(var, v);
}
static void anim_size_cb(void * var, int32_t v)
{
    lv_obj_set_size(var, v, v);
}
/**
* Create a playback animation
*/
void lv_example_anim_2(void)
{
//    创建一个红色小球
//    位于左侧中部(10,0)
/**
 * Change the alignment of an object and set new coordinates.
 * Equivalent to:
 * lv_obj_set_align(obj, align);
 * lv_obj_set_pos(obj, x_ofs, y_ofs);
 * @param obj       pointer to an object to align
 * @param align     type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used.
 * @param x_ofs     x coordinate offset after alignment
 * @param y_ofs     y coordinate offset after alignment

void lv_obj_align(struct _lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs);
 */
    lv_obj_t * obj = lv_obj_create(lv_scr_act());
    lv_obj_set_style_bg_color(obj, lv_palette_main(LV_PALETTE_RED), 0);
    lv_obj_set_style_radius(obj, LV_RADIUS_CIRCLE, 0);
    lv_obj_align(obj, LV_ALIGN_LEFT_MID, 10, 0);

    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_var(&a, obj);
    lv_anim_set_values(&a, 10, 50);//size的变化值
 /** 当前进方向准备就绪时,制作要播放的动画

 * Make the animation to play back to when the forward direction is ready
 * @param a         pointer to an initialized `lv_anim_t` variable
 * @param delay     delay in milliseconds before starting the playback animation.重放动画

static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint32_t delay)
 */
    lv_anim_set_time(&a, 1000);
    lv_anim_set_playback_delay(&a, 1000);
    lv_anim_set_playback_time(&a, 300);//回放动画用的时间
    lv_anim_set_repeat_delay(&a, 500);//延迟回放
/**
 * Make the animation repeat itself.
 * @param a         pointer to an initialized `lv_anim_t` variable
 * @param cnt       repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition.

static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint16_t cnt)
 */
    lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);//一直重复动画
    lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out);//变化速度

/**
 * Calculate the current value of an animation applying an "S" characteristic (cosine)
 * @param a     pointer to an animation
 * @return      the current value to set

int32_t lv_anim_path_ease_in_out(const lv_anim_t * a);
 */
    lv_anim_set_exec_cb(&a, anim_size_cb);//对象尺寸变化
    lv_anim_start(&a);
    lv_anim_set_exec_cb(&a, anim_x_cb);//位置变化
    lv_anim_set_values(&a, 10, 240);
    lv_anim_start(&a);
}

### 创建和实现 LVGL 8.3 动画效果 #### 设置动画图像并启动动画 为了在 LVGL 8.3 中创建和实现动画效果,可以通过 `lv_animimg` 组件来展示一系列图片作为动画。通过调用函数 `lv_animimg_set_repeat_count(lv_obj_t * obj, uint16_t count)` 来设定动画重复播放次数[^1]。 对于无限循环播放的情况,可利用宏定义 `LV_ANIM_REPEAT_INFINITE` 传递给上述方法中的参数 `count` 实现无尽回放的效果: ```c // 假设 animimg0 是已经创建好的 lv_animimg 对象实例 lv_animimg_set_repeat_count(animimg0, LV_ANIM_REPEAT_INFINITE); ``` 要使动画真正运行起来,则需确保之前已完成了必要的初始化工作,包括但不限于 LVGL 库本身及其依赖组件(比如显示驱动程序)的准备。这通常涉及如下几行核心代码片段,在硬件初始化完毕后执行[^2]: ```c lv_init(); lv_port_disp_init(); // 显示设备适配层初始化 lv_port_indev_init(); // 输入设备适配层初始化 ``` 当一切就绪之后,便可通过 GUI 设计工具或者编程方式构建具体的 UI 控件,并为其赋予相应的属性值以及行为逻辑,从而达到预期视觉呈现的目的。 #### 完整示例:创建一个简单的动画控件 下面给出一段完整的 C 语言源码用来说明如何基于 LVGL 构建一个具有动画特性的界面元素——这里选用的是带有帧序列变化功能的对象 `lv_animimg`: ```c #include "lvgl/lvgl.h" void setup() { // 初始化 LVGL 和其他必要资源... static lv_style_t style; lv_style_init(&style); /* Create an animated image object */ lv_obj_t* img = lv_animimg_create(lv_scr_act()); lv_obj_add_style(img, &style, 0); lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, 0); /* Set the source of images to be displayed sequentially as animation frames */ const char* srcs[] = {"res/frame_0.png", "res/frame_1.png", "res/frame_2.png"}; lv_animimg_set_src_array(img, (const void**)srcs, sizeof(srcs)/sizeof(char*) - 1); /* Start playing with infinite loop */ lv_animimg_start(img); } int main(void){ setup(); while(true){ lv_task_handler(); // 处理事件队列 usleep(5 * 1000); // 循环等待一段时间再处理下一次任务 } } ``` 这段代码展示了从环境搭建到最终渲染出动态图形的整体流程;其中特别注意到了样式应用、位置调整、数据绑定等细节操作,使得整个过程更加贴近实际应用场景下的开发需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值