/*---------------------------------------------------------------------------- * Copyright (c) TJD Technologies Co., Ltd. 2025. All rights reserved. * * Description: TjdUiPageManager.h * * Author: luziquan@ss-tjd.com * * Create: 2025-06-04 *--------------------------------------------------------------------------*/ #ifndef TJD_UI_PAGE_MANAGER_H #define TJD_UI_PAGE_MANAGER_H #include "animator/animator.h" #include "animator/easing_equation.h" #include "components/ui_image_view.h" #include "components/ui_view_group.h" #include namespace TJD { class UIPageBase : public OHOS::UIViewGroup { public: virtual ~UIPageBase() = default; /** * @brief 加载页面资源 */ virtual void PreLoad() {} /** * @brief 卸载页面资源 */ virtual void UnLoad() {} /** * @brief 页面显示事件 */ virtual void OnShow() {} /** * @brief 页面隐藏事件 */ virtual void OnHide() {} }; enum class PageTransitionType { PAGE_TRANSITION_INVALID = 0, PAGE_TRANSITION_TRANSLATION_ENTER, //平移进入 PAGE_TRANSITION_TRANSLATION_EXIT, //平移退出 PAGE_TRANSITION_TRANSLATION_MAX, }; class UIPageManager { public: UIPageManager() {} UIPageManager(OHOS::UIViewGroup *base) : baseView(base) {} /** * @brief 析构所有注册的页面对象,并调用页面的 UnLoad 方法来释放资源 */ virtual ~UIPageManager(); /** * @brief 设置基础视图,所有页面都添加到该视图上 * @param base */ void SetBaseView(OHOS::UIViewGroup *base) { baseView = base; } /** * @brief 预加载所有页面,调用每个页面的 PreLoad 方法来初始化 */ void PreLoadAllPages(); /** * @brief 注册一个页面,会调用页面的 PreLoad 方法来初始化 * @param pageId 页面ID * @param page 页面对象指针 * @return true * @return false */ bool RegisterPage(int16_t pageId, UIPageBase *page); /** * @brief 显示一个页面 * @param pageId 页面ID * @param type 页面切换动画类型,默认为无动画 * @note 如果当前页面已经是该页面,则不做任何操作, * 如果第一次调用,则直接显示该页面,显示后调用页面的OnShow方法, * 如果当前页面不是该页面,则先调用当前页面的OnHide方法,然后显示该页面并调用其OnShow方法。 * 如果没有动画, CurPage->OnHide() -> TargetPage->OnShow() * 如果有动画, TargetPage->OnShow() -> 动画 -> CurPage->OnHide() */ void ShowView(int16_t pageId, PageTransitionType type = PageTransitionType::PAGE_TRANSITION_INVALID); int16_t GetCurPageId() { return curPageId; } UIPageBase *GetPage(int16_t pageId); private: class PageInfo; class EffectAnimatorCallback; void StartAnimatorChangedView(int16_t pageId, PageTransitionType type); void AnimatorStopCallback(void); void PreLoadView(PageInfo *pageInfo); void ShowView(PageInfo *pageInfo); void HideView(PageInfo *pageInfo); EffectAnimatorCallback *animatorCallback_{nullptr}; OHOS::Animator *animator_{nullptr}; std::unordered_map map_; OHOS::UIViewGroup *baseView{nullptr}; int16_t changePageId{-1}; int16_t curPageId{-1}; }; } // namespace TJD #endif