mirror of
https://github.com/No-Chicken/Power-Pico.git
synced 2026-04-03 13:02:36 +08:00
update
This commit is contained in:
58
Power_Pico/User/GUI/common/lv_lib_animation.c
Normal file
58
Power_Pico/User/GUI/common/lv_lib_animation.c
Normal file
@@ -0,0 +1,58 @@
|
||||
#include "lv_lib_animation.h"
|
||||
|
||||
void lv_lib_anim_callback_set_x(void * var, int32_t v)
|
||||
{
|
||||
lv_obj_set_x(var, v);
|
||||
}
|
||||
|
||||
void lv_lib_anim_callback_set_y(void * var, int32_t v)
|
||||
{
|
||||
lv_obj_set_y(var, v);
|
||||
}
|
||||
|
||||
void lv_lib_anim_callback_set_hight(void * var, int32_t v)
|
||||
{
|
||||
lv_obj_set_height(var, v);
|
||||
}
|
||||
|
||||
void lv_lib_anim_callback_set_width(void * var, int32_t v)
|
||||
{
|
||||
lv_obj_set_width(var, v);
|
||||
}
|
||||
|
||||
void lv_lib_anim_callback_set_image_angle(void * var, int32_t v)
|
||||
{
|
||||
lv_image_set_rotation(var, v);
|
||||
}
|
||||
|
||||
void lv_lib_anim_callback_set_scale(void * var, int32_t v)
|
||||
{
|
||||
lv_image_set_scale(var, v);
|
||||
}
|
||||
|
||||
void lv_lib_anim_callback_set_opacity(void * var, int32_t v)
|
||||
{
|
||||
lv_obj_set_style_opa(var, v, LV_PART_MAIN | LV_STATE_DEFAULT);
|
||||
}
|
||||
|
||||
void lv_lib_anim_user_animation(lv_obj_t * TagetObj, uint16_t delay, uint16_t time, int16_t start_value, int16_t end_value,
|
||||
uint16_t playback_delay, uint16_t playback_time, uint16_t repeat_delay, uint16_t repeat_count,
|
||||
lv_anim_path_cb_t path_cb, lv_anim_exec_xcb_t exec_cb, lv_anim_completed_cb_t completed_cb)
|
||||
{
|
||||
lv_anim_t Animation;
|
||||
lv_anim_init(&Animation);
|
||||
lv_anim_set_var(&Animation, TagetObj);
|
||||
lv_anim_set_time(&Animation, time);
|
||||
lv_anim_set_values(&Animation, start_value, end_value);
|
||||
lv_anim_set_exec_cb(&Animation, exec_cb);
|
||||
lv_anim_set_path_cb(&Animation, path_cb);
|
||||
lv_anim_set_delay(&Animation, delay);
|
||||
lv_anim_set_playback_time(&Animation, playback_time);
|
||||
lv_anim_set_playback_delay(&Animation, playback_delay);
|
||||
lv_anim_set_repeat_count(&Animation, repeat_count);
|
||||
lv_anim_set_repeat_delay(&Animation, repeat_delay);
|
||||
lv_anim_set_early_apply(&Animation, false);
|
||||
lv_anim_set_completed_cb(&Animation, completed_cb);
|
||||
lv_anim_start(&Animation);
|
||||
}
|
||||
|
||||
18
Power_Pico/User/GUI/common/lv_lib_animation.h
Normal file
18
Power_Pico/User/GUI/common/lv_lib_animation.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#ifndef LV_LIB_ANIMATION_H
|
||||
#define LV_LIB_ANIMATION_H
|
||||
|
||||
#include "lvgl.h"
|
||||
|
||||
void lv_lib_anim_callback_set_x(void * var, int32_t v);
|
||||
void lv_lib_anim_callback_set_y(void * var, int32_t v);
|
||||
void lv_lib_anim_callback_set_hight(void * var, int32_t v);
|
||||
void lv_lib_anim_callback_set_width(void * var, int32_t v);
|
||||
void lv_lib_anim_callback_set_image_angle(void * var, int32_t v);
|
||||
void lv_lib_anim_callback_set_scale(void * var, int32_t v);
|
||||
void lv_lib_anim_callback_set_opacity(void * var, int32_t v);
|
||||
// user set animation
|
||||
void lv_lib_anim_user_animation(lv_obj_t * TagetObj, uint16_t delay, uint16_t time, int16_t start_value, int16_t end_value,
|
||||
uint16_t playback_delay, uint16_t playback_time, uint16_t repeat_delay, uint16_t repeat_count,
|
||||
lv_anim_path_cb_t path_cb, lv_anim_exec_xcb_t exec_cb, lv_anim_completed_cb_t completed_cb);
|
||||
|
||||
#endif // LV_LIB_ANIMATION_H
|
||||
117
Power_Pico/User/GUI/common/lv_lib_pm.c
Normal file
117
Power_Pico/User/GUI/common/lv_lib_pm.c
Normal file
@@ -0,0 +1,117 @@
|
||||
#include "./lv_lib_pm.h"
|
||||
#include <string.h>
|
||||
|
||||
// 定义全局实例
|
||||
PageManager_t PageManager;
|
||||
|
||||
/**
|
||||
* 初始化页面管理器
|
||||
*/
|
||||
void PageManager_init(void) {
|
||||
memset(&PageManager, 0, sizeof(PageManager));
|
||||
}
|
||||
|
||||
/**
|
||||
* load init screen
|
||||
*/
|
||||
void PageManager_load_init_screen(void) {
|
||||
if (PageManager.count == 0) return;
|
||||
|
||||
Page_t* initial_page = PageManager.pages[0];
|
||||
if (initial_page->init) initial_page->init();
|
||||
lv_scr_load_anim(*initial_page->page_obj, LV_SCR_LOAD_ANIM_MOVE_LEFT, 200, 0, true);
|
||||
PageManager.current_index = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册一个新页面
|
||||
* @param page 页面结构体指针
|
||||
*/
|
||||
void PageManager_register(Page_t* page) {
|
||||
if (PageManager.count >= MAX_PAGES) {
|
||||
LV_LOG_WARN("PageManager: page list is full!");
|
||||
return;
|
||||
}
|
||||
PageManager.pages[PageManager.count++] = page;
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换到下一个页面(循环)
|
||||
*/
|
||||
void PageManager_next(void) {
|
||||
if (PageManager.count == 0) return;
|
||||
|
||||
Page_t* prev = PageManager.pages[PageManager.current_index];
|
||||
Page_t* next = PageManager.pages[(PageManager.current_index + 1) % PageManager.count];
|
||||
|
||||
// 初始化新页面并切换
|
||||
if (next->init) next->init();
|
||||
lv_scr_load_anim(*next->page_obj, LV_SCR_LOAD_ANIM_MOVE_LEFT, 200, 0, true);
|
||||
|
||||
// 反初始化前页
|
||||
if (prev->deinit) prev->deinit();
|
||||
|
||||
// 更新索引
|
||||
PageManager.current_index = (PageManager.current_index + 1) % PageManager.count;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换到上一个页面(循环)
|
||||
*/
|
||||
void PageManager_prev(void) {
|
||||
if (PageManager.count == 0) return;
|
||||
|
||||
Page_t* current = PageManager.pages[PageManager.current_index];
|
||||
uint8_t prev_index = (PageManager.current_index == 0) ?
|
||||
PageManager.count - 1 : PageManager.current_index - 1;
|
||||
Page_t* prev = PageManager.pages[prev_index];
|
||||
|
||||
if (prev->init) prev->init();
|
||||
lv_scr_load_anim(*prev->page_obj, LV_SCR_LOAD_ANIM_MOVE_RIGHT, 200, 0, true);
|
||||
|
||||
if (current->deinit) current->deinit();
|
||||
|
||||
PageManager.current_index = prev_index;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳转到指定索引页面
|
||||
* @param index 目标页面索引
|
||||
*/
|
||||
void PageManager_goto(uint8_t index) {
|
||||
if (index >= PageManager.count || PageManager.count == 0) return;
|
||||
|
||||
Page_t* current = PageManager.pages[PageManager.current_index];
|
||||
Page_t* target = PageManager.pages[index];
|
||||
|
||||
if (current != target) {
|
||||
if (current->deinit) current->deinit();
|
||||
PageManager.current_index = index;
|
||||
if (target->init) target->init();
|
||||
lv_scr_load_anim(*target->page_obj, LV_SCR_LOAD_ANIM_FADE_IN, 200, 0, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前页面
|
||||
* @return 当前页面指针
|
||||
*/
|
||||
Page_t* PageManager_get_current_page(void) {
|
||||
if (PageManager.count == 0) return NULL;
|
||||
return PageManager.pages[PageManager.current_index];
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理按键事件,调用当前页面的按键事件处理函数
|
||||
* @param key_id 按键ID
|
||||
*/
|
||||
void PageManager_handle_key_event(uint8_t key_id) {
|
||||
Page_t* current_page = PageManager_get_current_page();
|
||||
if (current_page && current_page->key_event_handler) {
|
||||
current_page->key_event_handler(key_id); // 调用当前页面的按键事件处理函数
|
||||
} else {
|
||||
LV_LOG_WARN("No key event handler for current page\n");
|
||||
}
|
||||
}
|
||||
38
Power_Pico/User/GUI/common/lv_lib_pm.h
Normal file
38
Power_Pico/User/GUI/common/lv_lib_pm.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#ifndef PAGE_MANAGER_H
|
||||
#define PAGE_MANAGER_H
|
||||
|
||||
#include "lvgl.h"
|
||||
|
||||
// 最大支持页面数量
|
||||
#define MAX_PAGES 5
|
||||
|
||||
// 页面结构体
|
||||
typedef struct {
|
||||
void (*init)(void);
|
||||
void (*deinit)(void);
|
||||
lv_obj_t** page_obj; // 指向页面对象指针的指针
|
||||
void (*key_event_handler)(uint8_t key_id); // 按键事件处理函数
|
||||
const char* name; // 可选:用于调试
|
||||
} Page_t;
|
||||
|
||||
// 页面管理器结构体
|
||||
typedef struct {
|
||||
Page_t* pages[MAX_PAGES];
|
||||
uint8_t count;
|
||||
uint8_t current_index;
|
||||
} PageManager_t;
|
||||
|
||||
// 全局管理器实例(声明)
|
||||
extern PageManager_t PageManager;
|
||||
|
||||
// API 函数声明
|
||||
void PageManager_init(void);
|
||||
void PageManager_register(Page_t* page);
|
||||
void PageManager_load_init_screen(void);
|
||||
void PageManager_next(void);
|
||||
void PageManager_prev(void);
|
||||
void PageManager_goto(uint8_t index);
|
||||
Page_t* PageManager_get_current_page(void);
|
||||
void PageManager_handle_key_event(uint8_t key_id);
|
||||
|
||||
#endif // PAGE_MANAGER_H
|
||||
Reference in New Issue
Block a user