mcu_ab568x/app/platform/gui/components/compo_animation.c
2025-05-30 18:03:10 +08:00

285 lines
8.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "include.h"
#define TRACE_EN 0
#if TRACE_EN
#define TRACE(...) printf(__VA_ARGS__)
#else
#define TRACE(...)
#endif
/**
* @brief 创建一个动画框组件
* @param[in] frm : 窗体指针
* @param[in] res_addr : 动画资源地址
* @return 返回动画框指针
**/
compo_animation_t *compo_animation_create(compo_form_t *frm, u32 res_addr)
{
compo_animation_t *animation = compo_create(frm, COMPO_TYPE_ANIMATION);
widget_page_t *page = widget_page_create(frm->page_body);
widget_set_size(page, GUI_SCREEN_WIDTH, GUI_SCREEN_HEIGHT);
widget_image_t *img = widget_image_create(page, res_addr);
widget_set_pos(img, GUI_SCREEN_CENTER_X, GUI_SCREEN_CENTER_Y);
animation->img = img;
animation->page = page;
return animation;
}
/**
* @brief 设置动画
用于改变图像组件中的图片
* @param[in] animation : 动画指针
* @param[in] res_addr : 动画资源地址
**/
void compo_animation_set(compo_animation_t *animation, u32 res_addr)
{
widget_image_set(animation->img, res_addr);
}
/**
* @brief 设置下一个动画
用于切换动画组件中的图片
* @param[in] animation : 动画指针
**/
void compo_animation_manual_next(compo_animation_t *animation)
{
animation->index++;
if (animation->index >= animation->radix) {
animation->index = 0;
compo_animation_click_set_notvis(animation);
}
widget_image_cut(animation->img, 0, animation->hei * animation->index, animation->wid, animation->hei);
}
/**
* @brief 动画进程
用于切换动画
* @param[in] animation : 动画指针
**/
void compo_animation_process(compo_animation_t *animation)
{
if (animation->interval == 0) {
return;
}
if (tick_check_expire(animation->ticks, animation->interval)) {
animation->ticks = tick_get();
compo_animation_manual_next(animation);
}
}
/**
* @brief 设置动画的编号
* @param[in] animation : 动画指针
**/
void compo_animation_set_index(compo_animation_t *animation, u8 index)
{
animation->index = index;
}
/**
* @brief 设置动画的拼图总数
* @param[in] animation : 动画指针
* @param[in] radix : 拼图总数
**/
void compo_animation_set_radix(compo_animation_t *animation, u8 radix)
{
area_t area = widget_image_get_size(animation->img);
animation->radix = radix;
animation->wid = area.wid;
animation->hei = area.hei / radix;
widget_image_cut(animation->img, 0, animation->hei * animation->index, animation->wid, animation->hei);
}
/**
* @brief 设置动画的播放间隔
* @param[in] animation : 动画指针
* @param[in] interval : 动画播放间隔
**/
void compo_animation_set_interval(compo_animation_t *animation, u32 interval)
{
animation->interval = interval * 10;
}
/**
* @brief 获取animation ID
**/
int compo_get_animation_id(void)
{
component_t *compo = (component_t *)compo_pool_get_top();
while (compo != NULL) {
if (compo->type == COMPO_TYPE_ANIMATION) {
compo_animation_t *animation = (compo_animation_t *)compo;
if (compo_animation_get_click(animation)) {
if (animation->bond_data == COMPO_BOND_IMAGE_CLICK) {
return animation->id;
} else if (animation->bond_data == COMPO_BOND_ANIMATION_AREA_CLICK) {
if (!widget_get_visble(animation->img)) {
return animation->id;
}
}
}
}
compo = compo_get_next(compo); //遍历组件
}
return ID_NULL;
}
/**
* @brief 设置动画组件的坐标
注意:该设置默认的坐标是以中心点作为参考点
* @param[in] animation : 动画指针
* @param[in] x : x轴坐标
* @param[in] y : y轴坐标
**/
void compo_animation_set_pos(compo_animation_t *animation, s16 x, s16 y)
{
//widget_set_pos(animation->img, x, y);
widget_set_pos(animation->page, x, y);
}
// /**
// * @brief 设置动画组件的大小
// * @param[in] animation : 动画指针
// * @param[in] width : 动画宽度
// * @param[in] height : 动画高度
// **/
// void compo_animation_set_size(compo_animation_t *animation, s16 width, s16 height)
// {
// widget_set_size(animation->img, width, height);
// }
/**
* @brief 设置动画组件的大小需要放在compo_animation_set_radix之后
* @param[in] animation : 动画指针
* @param[in] width : 动画宽度
* @param[in] height : 动画高度
**/
void compo_animation_set_size(compo_animation_t *animation, s16 width, s16 height)
{
// widget_set_size(animation->img, width, height);
if (animation->wid && animation->hei) {
widget_page_scale_to(animation->page, width * GUI_SCREEN_WIDTH / animation->wid, height * GUI_SCREEN_HEIGHT / animation->hei);
}
}
/**
* @brief 设置动画的旋转角度
图片旋转时,需要经过转换工具勾上 旋转压缩 的选项
* @param[in] animation : 动画指针
* @param[in] angle : 旋转的角度
**/
void compo_animation_set_rotation(compo_animation_t *animation, s16 angle)
{
widget_image_set_rotation(animation->img, angle);
}
/**
* @brief 设置动画的旋转中心点
* @param[in] animation : 动画指针
* @param[in] x : x轴坐标
* @param[in] y : y轴坐标
**/
void compo_animation_set_rotation_center(compo_animation_t *animation, s16 x, s16 y)
{
widget_image_set_rotation_center(animation->img, x, y);
}
/**
* @brief 设置动画是否可见
* @param[in] animation : 动画指针
* @param[in] visible : true 可见
false 不可见
**/
void compo_animation_set_visible(compo_animation_t *animation, bool visible)
{
widget_set_visible(animation->img, visible);
}
/**
* @brief 获取动画的坐标和大小
* @param[in] animation : 动画指针
* @return 返回动画的坐标和大小
**/
rect_t compo_animation_get_size(compo_animation_t *animation)
{
rect_t rect = widget_get_location(animation->img);
return rect;
}
/**
* @brief 创建一个长图像框滚动组件
用于首尾可衔接的图片,进行循环滚动
切图时需要将长图按radix裁剪然后上下排布
* @param[in] animation : 动画指针
* @param[in] res_addr : 动画资源
**/
void compo_animation_set_roll(compo_animation_t *animation, u32 res_addr)
{
widget_image_t *img[animation->radix+1];
widget_set_size(animation->page, animation->wid, animation->hei);
for (int i=0; i<=animation->radix; i++) {
img[i] = widget_image_create(animation->page, res_addr);
if (i != animation->radix) {
widget_image_cut(img[i], 0, animation->hei * i, animation->wid, animation->hei);
} else {
widget_image_cut(img[i], 0, animation->hei * 0, animation->wid, animation->hei); //首尾图片一致
}
widget_set_align_center(img[i], false);
widget_set_pos(img[i], animation->wid * i, 0); //图片裁剪排布 0-1-2...-0
}
}
/**
* @brief 设置动画的点击区域
* @param[in] animation : 动画指针
**/
void compo_animation_set_click_area(compo_animation_t *animation, s16 x, s16 y, s16 width, s16 height)
{
animation->click_area.x = x;
animation->click_area.y = y;
animation->click_area.wid = width;
animation->click_area.hei = height;
}
/**
* @brief 获取动画是否在点击区域内
* @param[in] animation : 动画指针
* @return 返回是或否
**/
bool compo_animation_get_click(compo_animation_t *animation)
{
point_t pt = ctp_get_sxy();
rect_t *rect = &animation->click_area;
if (abs_s(pt.x - rect->x) * 2 <= rect->wid && abs_s(pt.y - rect->y) * 2 <= rect->hei) {
return true;
}
return false;
}
/**
* @brief 设置区域点击动画可视
**/
void compo_animation_click_set_vis(compo_animation_t *animation)
{
if (animation->bond_data == COMPO_BOND_ANIMATION_AREA_CLICK) {
point_t pt = ctp_get_rxy(func_cb.frm_main->page_body);
compo_animation_set_pos(animation, pt.x, pt.y);
compo_animation_set_index(animation, 0);
compo_animation_set_visible(animation, true);
widget_image_cut(animation->img, 0, 0, animation->wid, animation->hei);
}
}
/**
* @brief 设置区域点击动画不可视
* @param[in] animation : 动画指针
**/
void compo_animation_click_set_notvis(compo_animation_t *animation)
{
if (animation->bond_data == COMPO_BOND_ANIMATION_AREA_CLICK) {
compo_animation_set_visible(animation, false);
}
}