1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00
lvgl/src/lv_misc/lv_anim.h

383 lines
12 KiB
C
Raw Normal View History

2017-11-23 20:42:14 +01:00
/**
* @file anim.h
*
*/
#ifndef ANIM_H
#define ANIM_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "../lv_conf_internal.h"
2017-11-23 20:42:14 +01:00
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
2017-11-23 20:42:14 +01:00
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
2019-06-27 18:07:26 -04:00
/** Can be used to indicate if animations are enabled or disabled in a case*/
enum {
2019-06-27 07:16:15 +02:00
LV_ANIM_OFF,
LV_ANIM_ON,
};
typedef uint8_t lv_anim_enable_t;
2019-06-27 18:07:26 -04:00
/** Type of the animated value*/
typedef lv_coord_t lv_anim_value_t;
#if LV_USE_ANIMATION
2020-02-19 06:18:24 +01:00
#define LV_ANIM_REPEAT_INFINIT 0xFFFF
2017-12-17 01:54:09 +01:00
struct _lv_anim_t;
2017-11-23 20:42:14 +01:00
2019-06-27 18:07:26 -04:00
/** Generic prototype of "animator" functions.
* First parameter is the variable to animate.
* Second parameter is the value to set.
2019-06-12 23:10:54 +02:00
* Compatible with `lv_xxx_set_yyy(obj, value)` functions
* The `x` in `_xcb_t` means its not a fully generic prototype because
* it doesn't receive `lv_anim_t *` as its first argument*/
typedef void (*lv_anim_exec_xcb_t)(void *, lv_anim_value_t);
2017-11-23 20:42:14 +01:00
2019-06-27 18:07:26 -04:00
/** Same as `lv_anim_exec_xcb_t` but receives `lv_anim_t *` as the first parameter.
* It's more consistent but less convenient. Might be used by binding generator functions.*/
typedef void (*lv_anim_custom_exec_cb_t)(struct _lv_anim_t *, lv_anim_value_t);
2019-06-27 18:07:26 -04:00
/** Get the current value during an animation*/
typedef lv_anim_value_t (*lv_anim_path_cb_t)(const struct _lv_anim_t *);
2019-04-22 08:45:07 +02:00
2019-06-27 18:07:26 -04:00
/** Callback to call when the animation is ready*/
2019-04-22 08:45:07 +02:00
typedef void (*lv_anim_ready_cb_t)(struct _lv_anim_t *);
2017-11-23 20:42:14 +01:00
/** Callback to call when the animation really stars (considering `delay`)*/
typedef void (*lv_anim_start_cb_t)(struct _lv_anim_t *);
2019-06-27 18:07:26 -04:00
/** Describes an animation*/
2017-12-17 01:54:09 +01:00
typedef struct _lv_anim_t
2017-11-23 20:42:14 +01:00
{
2019-06-27 18:07:26 -04:00
void * var; /**<Variable to animate*/
lv_anim_exec_xcb_t exec_cb; /**< Function to execute to animate*/
lv_anim_path_cb_t path_cb; /**< Function to get the steps of animations*/
lv_anim_start_cb_t start_cb; /**< Call it when the animation is starts (considering `delay`)*/
2019-06-27 18:07:26 -04:00
lv_anim_ready_cb_t ready_cb; /**< Call it when the animation is ready*/
int32_t start; /**< Start value*/
int32_t end; /**< End value*/
2020-02-19 06:18:24 +01:00
uint32_t time; /**< Animation time in ms*/
int32_t act_time; /**< Current time in animation. Set to negative to make delay.*/
uint32_t playback_delay; /**< Wait before play back*/
uint32_t playback_time; /**< Duration of playback animation*/
uint32_t repeat_delay; /**< Wait before repeat*/
uint16_t repeat_cnt; /**< Repeat count for the animation*/
uint8_t early_apply :1; /**< 1: Apply start value immediately even is there is `delay` */
#if LV_USE_USER_DATA
2019-06-27 18:07:26 -04:00
lv_anim_user_data_t user_data; /**< Custom user data*/
2019-04-22 08:45:07 +02:00
#endif
2018-06-19 09:49:58 +02:00
/*Animation system use these - user shouldn't set*/
2020-02-19 06:18:24 +01:00
uint32_t time_orig;
2019-06-27 18:07:26 -04:00
uint8_t playback_now : 1; /**< Play back is in progress*/
uint32_t has_run : 1; /**< Indicates the animation has run in this round*/
2018-06-19 09:49:58 +02:00
} lv_anim_t;
2017-11-23 20:42:14 +01:00
2019-06-11 13:51:14 +02:00
2017-11-23 20:42:14 +01:00
/**********************
* GLOBAL PROTOTYPES
**********************/
/**
* Init. the animation module
*/
2019-05-15 06:15:12 +02:00
void lv_anim_core_init(void);
/**
* Initialize an animation variable.
* E.g.:
* lv_anim_t a;
* lv_anim_init(&a);
* lv_anim_set_...(&a);
* lv_anim_create(&a);
* @param a pointer to an `lv_anim_t` variable to initialize
2019-05-15 06:15:12 +02:00
*/
void lv_anim_init(lv_anim_t * a);
2019-05-15 06:15:12 +02:00
/**
2020-02-19 06:18:24 +01:00
* Set a variable to animate
* @param a pointer to an initialized `lv_anim_t` variable
* @param var pointer to a variable to animate
2020-02-19 06:18:24 +01:00
*/
static inline void lv_anim_set_var(lv_anim_t * a, void * var)
{
a->var = var;
}
/**
* Set a function to animate `var`
* @param a pointer to an initialized `lv_anim_t` variable
* @param exec_cb a function to execute during animation
2019-05-27 05:46:19 +02:00
* LittelvGL's built-in functions can be used.
* E.g. lv_obj_set_x
*/
2020-02-19 06:18:24 +01:00
static inline void lv_anim_set_exec_cb(lv_anim_t * a, lv_anim_exec_xcb_t exec_cb)
2019-05-15 06:15:12 +02:00
{
2019-05-27 05:46:19 +02:00
a->exec_cb = exec_cb;
2019-05-15 06:15:12 +02:00
}
/**
2020-02-19 06:18:24 +01:00
* Set the duration of an animation
* @param a pointer to an initialized `lv_anim_t` variable
* @param duration duration of the animation in milliseconds
*/
2020-02-19 06:18:24 +01:00
static inline void lv_anim_set_time(lv_anim_t * a, uint32_t duration)
2019-05-15 06:15:12 +02:00
{
2019-06-06 06:05:40 +02:00
a->time = duration;
2020-02-19 06:18:24 +01:00
}
/**
* Set a delay before starting the animation
* @param a pointer to an initialized `lv_anim_t` variable
* @param delay delay before the animation in milliseconds
*/
static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay)
{
a->act_time = (int32_t)(-delay);
2019-05-15 06:15:12 +02:00
}
/**
* Set the start and end values of an animation
* @param a pointer to an initialized `lv_anim_t` variable
* @param start the start value
* @param end the end value
*/
2019-05-15 06:15:12 +02:00
static inline void lv_anim_set_values(lv_anim_t * a, lv_anim_value_t start, lv_anim_value_t end)
{
a->start = start;
2019-06-06 06:05:40 +02:00
a->end = end;
2019-05-15 06:15:12 +02:00
}
/**
2020-02-19 06:18:24 +01:00
* Similar to `lv_anim_set_exec_cb` but `lv_anim_custom_exec_cb_t` receives
* `lv_anim_t * ` as its first parameter instead of `void *`.
* This function might be used when LittlevGL is binded to other languages because
* it's more consistent to have `lv_anim_t *` as first parameter.
2020-02-19 06:18:24 +01:00
* The variable to animate can be stored in the animation's `user_sata`
* @param a pointer to an initialized `lv_anim_t` variable
* @param exec_cb a function to execute.
*/
static inline void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb)
{
2019-06-06 06:05:40 +02:00
a->var = a;
2019-06-12 23:10:54 +02:00
a->exec_cb = (lv_anim_exec_xcb_t)exec_cb;
}
/**
* Set the path (curve) of the animation.
* @param a pointer to an initialized `lv_anim_t` variable
* @param path_cb a function the get the current value of the animation.
* The built in functions starts with `lv_anim_path_...`
*/
2019-05-15 06:15:12 +02:00
static inline void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb)
{
a->path_cb = path_cb;
}
/**
* Set a function call when the animation really starts (considering `delay`)
* @param a pointer to an initialized `lv_anim_t` variable
* @param start_cb a function call when the animation starts
*/
static inline void lv_anim_set_start_cb(lv_anim_t * a, lv_anim_ready_cb_t start_cb)
{
a->start_cb = start_cb;
}
/**
* Set a function call when the animation is ready
* @param a pointer to an initialized `lv_anim_t` variable
* @param ready_cb a function call when the animation is ready
*/
2019-05-15 06:15:12 +02:00
static inline void lv_anim_set_ready_cb(lv_anim_t * a, lv_anim_ready_cb_t ready_cb)
{
a->ready_cb = ready_cb;
}
/**
* Make the animation to play back to when the forward direction is ready
* @param a pointer to an initialized `lv_anim_t` variable
2020-02-19 06:18:24 +01:00
* @param time the duration of the playback animation in in milliseconds. 0: disable playback
*/
2020-02-19 06:18:24 +01:00
static inline void lv_anim_set_playback_time(lv_anim_t * a, uint16_t time)
2019-05-15 06:15:12 +02:00
{
2020-02-19 06:18:24 +01:00
a->playback_time = time;
2019-05-15 06:15:12 +02:00
}
/**
2020-02-19 06:18:24 +01:00
* Make the animation to play back to when the forward direction is ready
* @param a pointer to an initialized `lv_anim_t` variable
2020-02-19 06:18:24 +01:00
* @param delay delay in milliseconds before starting the playback animation.
*/
2020-02-19 06:18:24 +01:00
static inline void lv_anim_set_playback_delay(lv_anim_t * a, uint16_t delay)
2019-05-15 06:15:12 +02:00
{
2020-02-19 06:18:24 +01:00
a->playback_delay = delay;
2019-05-15 06:15:12 +02:00
}
/**
2020-02-19 06:18:24 +01:00
* Make the animation repeat itself.
* @param a pointer to an initialized `lv_anim_t` variable
2020-02-19 06:18:24 +01:00
* @param cnt repeat count or `LV_ANIM_REPEAT_INFINITE` for infinite repetition. 0: to disable repetition.
*/
2020-02-19 06:18:24 +01:00
static inline void lv_anim_set_repeat_count(lv_anim_t * a, uint16_t cnt)
2019-05-15 06:15:12 +02:00
{
2020-02-19 06:18:24 +01:00
a->repeat_cnt = cnt;
2019-05-15 06:15:12 +02:00
}
/**
2020-02-19 06:18:24 +01:00
* Set a delay before repeating the animation.
* @param a pointer to an initialized `lv_anim_t` variable
2020-02-19 06:18:24 +01:00
* @param delay delay in milliseconds before repeating the animation.
*/
2020-02-19 06:18:24 +01:00
static inline void lv_anim_set_repeat_delay(lv_anim_t * a, uint16_t delay)
2019-05-15 06:15:12 +02:00
{
2020-02-19 06:18:24 +01:00
a->repeat_delay = delay;
2019-05-15 06:15:12 +02:00
}
2017-11-23 20:42:14 +01:00
/**
* Create an animation
* @param a an initialized 'anim_t' variable. Not required after call.
2017-11-23 20:42:14 +01:00
*/
2020-02-19 06:18:24 +01:00
void lv_anim_start(lv_anim_t * a);
2017-11-23 20:42:14 +01:00
2020-02-20 12:14:17 +01:00
/**
* Get a delay before starting the animation
* @param a pointer to an initialized `lv_anim_t` variable
* @return delay before the animation in milliseconds
*/
static inline int32_t lv_anim_get_delay(lv_anim_t * a)
{
return -a->act_time;
}
2017-11-23 20:42:14 +01:00
/**
2019-05-17 07:50:00 +02:00
* Delete an animation of a variable with a given animator function
2017-11-23 20:42:14 +01:00
* @param var pointer to variable
2019-05-17 07:50:00 +02:00
* @param exec_cb a function pointer which is animating 'var',
* or NULL to ignore it and delete all the animations of 'var
2017-11-23 20:42:14 +01:00
* @return true: at least 1 animation is deleted, false: no animation is deleted
*/
2019-06-12 23:10:54 +02:00
bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb);
2019-05-17 07:50:00 +02:00
/**
2020-02-19 06:18:24 +01:00
* Delete an animation by getting the animated variable from `a`.
2019-05-17 07:50:00 +02:00
* Only animations with `exec_cb` will be deleted.
2020-02-19 06:18:24 +01:00
* This function exists because it's logical that all anim. functions receives an
* `lv_anim_t` as their first parameter. It's not practical in C but might make
* the API more consequent and makes easier to generate bindings.
2019-05-17 07:50:00 +02:00
* @param a pointer to an animation.
* @param exec_cb a function pointer which is animating 'var',
* or NULL to ignore it and delete all the animations of 'var
* @return true: at least 1 animation is deleted, false: no animation is deleted
*/
static inline bool lv_anim_custom_del(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb)
2019-05-17 07:50:00 +02:00
{
2019-06-12 23:10:54 +02:00
return lv_anim_del(a->var, (lv_anim_exec_xcb_t)exec_cb);
2019-05-17 07:50:00 +02:00
}
2017-11-23 20:42:14 +01:00
2018-11-09 12:36:38 +01:00
/**
* Get the number of currently running animations
* @return the number of running animations
*/
uint16_t lv_anim_count_running(void);
2017-11-23 20:42:14 +01:00
/**
* Calculate the time of an animation with a given speed and the start and end values
* @param speed speed of animation in unit/sec
* @param start start value of the animation
* @param end end value of the animation
* @return the required time [ms] for the animation with the given parameters
*/
uint16_t lv_anim_speed_to_time(uint16_t speed, lv_anim_value_t start, lv_anim_value_t end);
2017-11-23 20:42:14 +01:00
2019-12-19 11:14:51 +01:00
/**
* Manually refresh the state of the animations.
* Useful to make the animations running in a blocking process where
* `lv_task_handler` can't run for a while.
* Shouldn't be used directly because it is called in `lv_refr_now()`.
*/
void lv_anim_refr_now(void);
2017-11-23 20:42:14 +01:00
/**
2017-12-17 01:54:09 +01:00
* Calculate the current value of an animation applying linear characteristic
* @param a pointer to an animation
* @return the current value to set
2017-11-23 20:42:14 +01:00
*/
lv_anim_value_t lv_anim_path_linear(const lv_anim_t * a);
2017-11-23 20:42:14 +01:00
2019-01-22 15:50:00 +01:00
/**
* Calculate the current value of an animation slowing down the start phase
* @param a pointer to an animation
* @return the current value to set
*/
lv_anim_value_t lv_anim_path_ease_in(const lv_anim_t * a);
2019-01-22 15:50:00 +01:00
/**
* Calculate the current value of an animation slowing down the end phase
* @param a pointer to an animation
* @return the current value to set
*/
lv_anim_value_t lv_anim_path_ease_out(const lv_anim_t * a);
2018-06-09 08:45:38 +02:00
/**
* Calculate the current value of an animation applying an "S" characteristic (cosine)
* @param a pointer to an animation
* @return the current value to set
*/
lv_anim_value_t lv_anim_path_ease_in_out(const lv_anim_t * a);
2018-06-09 08:45:38 +02:00
2018-11-20 14:49:16 +01:00
/**
* Calculate the current value of an animation with overshoot at the end
* @param a pointer to an animation
* @return the current value to set
*/
lv_anim_value_t lv_anim_path_overshoot(const lv_anim_t * a);
2018-11-20 14:49:16 +01:00
2018-11-24 07:38:07 +01:00
/**
* Calculate the current value of an animation with 3 bounces
* @param a pointer to an animation
* @return the current value to set
*/
lv_anim_value_t lv_anim_path_bounce(const lv_anim_t * a);
2018-11-24 07:38:07 +01:00
2017-12-17 01:54:09 +01:00
/**
* Calculate the current value of an animation applying step characteristic.
* (Set end value on the end of the animation)
* @param a pointer to an animation
* @return the current value to set
*/
lv_anim_value_t lv_anim_path_step(const lv_anim_t * a);
2019-04-22 08:45:07 +02:00
2017-11-23 20:42:14 +01:00
/**********************
* MACROS
**********************/
#endif /*LV_USE_ANIMATION == 0*/
2017-11-27 17:48:54 +01:00
2017-11-23 20:42:14 +01:00
#ifdef __cplusplus
} /* extern "C" */
#endif
2017-11-27 17:48:54 +01:00
#endif /*LV_ANIM_H*/