From cd01562be72b7b1d306a2d6ab743990642f82385 Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Mon, 20 Apr 2026 16:05:32 +0800 Subject: [PATCH] =?utf8?q?application/wearable/nativeabilityfwk=E6=96=87?= =?utf8?q?=E4=BB=B6=E5=A4=B91201patch=E5=90=88=E5=B9=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../n9/nativeabilityfwk/CMakeLists.txt | 9 +- .../n9/nativeabilityfwk/include/Ability.h | 110 +++++--- .../nativeabilityfwk/include/AbilitySlice.h | 6 +- .../include/BackDragListener.h | 1 + .../include/PageTransitionMgr.h | 2 +- .../n9/nativeabilityfwk/include/Presenter.h | 7 +- .../nativeabilityfwk/include/RecentManager.h | 7 +- .../n9/nativeabilityfwk/include/Slice.h | 2 +- .../include/SlicePageFactory.h | 7 +- .../include/SlicePageManager.h | 4 +- .../nativeabilityfwk/include/TransitionType.h | 15 +- .../n9/nativeabilityfwk/include/View.h | 7 +- .../n9/nativeabilityfwk/src/Ability.cpp | 255 +++++++++++++----- .../n9/nativeabilityfwk/src/AbilitySlice.cpp | 25 +- .../BackToCrossShapedTransition.cpp | 124 +++++++++ .../transition/BackToCrossShapedTransition.h | 39 +++ .../transition/BackToHexagonsTransition.cpp | 5 +- .../transition/BackToWaterfallTransition.cpp | 5 +- .../src/transition/CrossShapedTransition.cpp | 135 ++++++++++ .../src/transition/CrossShapedTransition.h | 39 +++ .../transition/EnterWaterfallTransition.cpp | 3 +- .../src/transition/FadeInOutTransition.cpp | 73 +++++ .../src/transition/FadeInOutTransition.h | 25 ++ .../src/transition/GaussianBlurTransition.cpp | 136 ++++++++++ .../src/transition/GaussianBlurTransition.h | 34 +++ .../src/transition/HexagonsTransition.cpp | 5 +- .../src/transition/ThreeDFoldTransition.cpp | 69 +++++ .../src/transition/ThreeDFoldTransition.h | 25 ++ .../src/transition/TransitionUtils.h | 42 +++ .../TransparentGradientTransition.cpp | 78 ++++++ .../TransparentGradientTransition.h | 33 +++ .../src/transition/WaterfallTransition.cpp | 5 +- .../src/transition/ZoomTransition.cpp | 96 +++---- .../src/transition/ZoomTransition.h | 7 +- 34 files changed, 1254 insertions(+), 181 deletions(-) create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.cpp create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.h create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.cpp create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.h create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.h create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.h create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransitionUtils.h create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp create mode 100644 code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.h diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/CMakeLists.txt b/code/sdk/application/wearable/n9/nativeabilityfwk/CMakeLists.txt index b59c59744..7a0140939 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/CMakeLists.txt +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/CMakeLists.txt @@ -20,8 +20,6 @@ set(PRIVATE_HEADER ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks ${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include - ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/events - ${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/ ) set(SOURCES @@ -29,12 +27,19 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/AbilitySlice.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/NativeAbility.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/StartNative.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ZoomOutTransition.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ZoomTransition.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/ThreeDFoldTransition.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/FadeInOutTransition.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/HexagonsTransition.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToHexagonsTransition.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToWaterfallTransition.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/WaterfallTransition.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/EnterWaterfallTransition.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/TransparentGradientTransition.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/GaussianBlurTransition.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/CrossShapedTransition.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/transition/BackToCrossShapedTransition.cpp ) set(COMPONENT_PUBLIC_CCFLAGS diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/Ability.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/Ability.h index bd82b42a2..13a4f40be 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/Ability.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/Ability.h @@ -33,29 +33,59 @@ #include "AppViewIDs.h" namespace OHOS { const static uint16_t gSliceInvalid = 0; -const static uint16_t gPageInvalid = 0; +const static uint16_t gPageInvalid = 0; const static uint16_t gSliceDefaultPriority = 4; // 页面默认是最低优先级 +struct ExtralConfig { + uint16_t pageId; + TransitionType type; + bool enableSlideBack; +}; + +// 定义默认配置 +constexpr ExtralConfig DEFAULT_CONF = {gPageInvalid, TransitionType::TRANSITION_INVALID, false}; + class Ability { public: void AddSliceProxy(uint16_t sliceId, SliceProxy* proxy); /** - * @brief Switch to specified page in the current slice, matched page will be created, and current slice will not be - * recreated. if slices or pages is being switched, this operation will be canceled + * @brief Switch to specified page in the current slice, target page will be created, and current slice will + * not be recreated. if slices or pages is being switched, this operation will be canceled * @param pageId Indicates the specified id of the page in the current slice, it should not be zero - * @param data Indicates the data which will be transfered to next page, default value is nullptr * @param type Indicates Transition animation type, which is declared in TransitionType.h. The matched * Transitioncallback should have params: enableCurrentSnapshot_ = false enableTargetSnapshot_ = false - * @param canBack Indicates whether current page should be cached and can be back from target page + * @param canBack Indicates whether current page will be cached or destroyed. if cached, can back from target page + * @param data Indicates the data which will be transfered to next page, default value is nullptr, + * data can only be native C structures or basic data types + * @param dataLength Indicates the length of data * @return Returns true if the pages is switched successfully, returns false otherwise. + * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue + */ + bool SwitchPageInSlice(uint16_t pageId, TransitionType type = TransitionType::TRANSITION_INVALID, + bool canBack = false, void* data = nullptr, uint16_t dataLength = 0); + + /** + * @brief Back to previous cached page in the current slice, current page will be destroyed, and previous + * cached page will be resumed. if slices or pages is being switched, this operation will be canceled + * @return Returns true if back to cached page successfully, returns false if no cached page. + * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue + */ + bool BackToPrevSlicePage(); + + /** + * @brief Back to target cached page in the current slice, current page and the cached pages on the top of target + * cached page will be destroyed, target cached page will be resumed. if slices or pages is being + * switched, this operation will be canceled + * @param pageId Indicates the target page id in cached pages, it should not be zero + * @return Returns true if back to target cached page successfully, returns false otherwise. + * @note It is recommended to call this method in the UI thread, and the event will be post into graphic event queue */ - bool SwitchPageInSlice(uint16_t pageId, void* data = nullptr, - TransitionType type = TransitionType::TRANSITION_INVALID, bool canBack = false); + bool BackToCachedSlicePage(uint16_t pageId); /** * @brief Switch to specified slice. matched slice will be created. - * 1. If pageId is valid or default page is exist, matched page will also be created + * 1. If pageId is valid or default page exists, matched page will also be created * 2. If slices is being switched, this operation will be cached and run later. * @param sliceId Indicates the specified id of the slice * @param pageId Indicates the specified id of the slice, if pageId is invalid, default page will be used. @@ -65,6 +95,15 @@ public: void SwitchSlice(uint16_t sliceId, uint16_t pageId = gPageInvalid, TransitionType type = TransitionType::TRANSITION_INVALID, bool enableSlideBack = false); + /** + * @brief Switch to specified slice. matched slice will be created. + * 1. If pageId is valid or default page exists, matched page will also be created + * 2. If slices is being switched, this operation will be cached and run later. + * @param config Indicates the extern config of the slice. + */ + void SwitchSliceWithData(uint16_t sliceId, void* data, uint16_t dataLength, + const ExtralConfig& config = DEFAULT_CONF); + /** * @brief Switch to specified slice. matched slice will be created. * 1. If default page is exist, default page will also be created @@ -79,6 +118,8 @@ public: void ChangeSlice(uint16_t sliceId, TransitionType type = TransitionType::TRANSITION_INVALID, uint16_t priority = gSliceDefaultPriority, bool enableSlideBack = false); + void ChangeSliceToApplist(); + /** * @brief Get SlicePageManager of currrent slice. you can Use SlicePageManager to get page info in the slice. * @return Returns nullptr if slices is being switched, or js ability is running @@ -108,21 +149,9 @@ public: uint16_t GetPreSliceId(void) { if (allSlices_.Size() < 2) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] GetPreSliceId - allSlices_ size < 2 (%d), returning invalid", allSlices_.Size()); return gSliceInvalid; } - uint16_t preSliceId = static_cast(allSlices_[allSlices_.Size() - 2] & SLICE_MASK); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] GetPreSliceId - allSlices_ size: %d, preSliceId: %d", allSlices_.Size(), preSliceId); - - // 打印 allSlices_ 的完整内容用于调试 - // printf("[DEBUG] allSlices_ content: ["); - // for (int i = 0; i < allSlices_.Size(); i++) { - // printf("%d", allSlices_[i] & SLICE_MASK); - // if (i < allSlices_.Size() - 1) printf(", "); - // } - // printf("]\n"); - - return preSliceId; + return static_cast(allSlices_[allSlices_.Size() - 2] & SLICE_MASK); } void UpdateCurSlicePageId(uint16_t pageId); @@ -159,6 +188,8 @@ public: void PauseSlice(); void StopSliceTransition(); void BackToPreSlice(); + void EnterAod(); + void ExitAod(uint32_t targetId); /* -------------------------------------------------------------------------- */ /// @brief 当从一个切片(Slice)进入另一个切片时被调用。 @@ -174,17 +205,12 @@ public: } ChangeSlice(sliceId,transitionId,priority,enableSlideBack); // 切换到新的Slice } - uint16_t GettopSliceId(void) { if (!backStack_.empty() ) { return backStack_.top(); } return 0; } - - - // 处理后退操作 - /// @brief 处理后退操作。 /// @param transitionId 切换的动画类型 /// @param priority 切换优先级 @@ -205,7 +231,6 @@ public: return false; // 返回false表示无前一个slice,退回到默认slice } } - /// @brief 处理后退多级切片的操作。 /// @param count 指定的后退级数 /// @param transitionId 切换的动画类型 @@ -237,9 +262,29 @@ public: } } //仅用于打电话结束恢复时使用 - bool Back_CountSlice_make_phone(const TransitionType transitionId = TransitionType::TRANSITION_INVALID, - const uint16_t priority = gSliceDefaultPriority); - + bool Back_CountSlice_make_phone(const TransitionType transitionId,const uint16_t priority ) + { + if(!backStack_.empty()) + { + // 如果此时 backStack_ 栈不为空,取出栈顶的切片 ID ,并调用 ChangeSlice 切换到该切片,返回 true 。 + uint16_t preSlice = backStack_.top(); + backStack_.pop(); + + #ifdef CUSTOM_ZHIHUI + if(preSlice!=VIEW_INCOMING_CALL) + ChangeSlice(preSlice); + else + ChangeSlice(defaultTargetId_); + #endif + return true; + } + else + { + //如果 backStack_ 栈为空,切换到默认切片,返回 false 。 + ChangeSlice(defaultTargetId_); + return false; // 返回false表示无前一个slice,退回到默认slice + } + } bool make_phone_push(uint16_t preSlice) { if(backStack_.empty()) @@ -286,7 +331,7 @@ public: protected: // targetId consists of slice id and page id - void StartSlice(uint32_t targetId); + void StartSlice(uint32_t targetId, void* data = nullptr); void ResumeSliceWithoutJS(); void StopSlice(); Ability() = default; @@ -314,10 +359,11 @@ protected: SliceStruct curSlice_; SliceStruct nextSlice_; + SliceStruct prevAodSlice_; uint32_t targetIdFromJS_ = 0; uint32_t defaultTargetId_ = gSliceInvalid; uint16_t curSlicePriority_ = gSliceDefaultPriority; - void PostChangeSlice(uint32_t targetId, TransitionType type); + void PostChangeSlice(uint32_t targetId, TransitionType type, void* data); Ability::ProxyStruct* Find(const uint16_t sliceId); private: std::stack backStack_;//这个栈会在每次进入一个新的Slice时将其ID压入栈顶,当用户请求后退时,栈顶的Slice ID会被弹出,以此来访问前一个Slice。 diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/AbilitySlice.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/AbilitySlice.h index 09a8c81e4..1e201d71f 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/AbilitySlice.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/AbilitySlice.h @@ -35,7 +35,7 @@ public: : sliceId_(targetId & SLICE_MASK), view_(viewBase), presenter_(presenterBase), slicePageMgr_(targetId), state_(SliceState::UNINITIALIZED) {} - void OnStart() override; + void OnStart(void* data) override; void OnResume() override; @@ -47,6 +47,10 @@ public: bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack); + bool BackToPrevSlicePage(); + + bool BackToCachedSlicePage(uint16_t pageId); + SlicePageManager* GetSlicePageManger() { return &slicePageMgr_; diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/BackDragListener.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/BackDragListener.h index 4cca1dfbe..b7f3132b8 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/BackDragListener.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/BackDragListener.h @@ -14,6 +14,7 @@ namespace OHOS { class BackDragListener : public UIView::OnDragListener { public: + static int16_t maxDragRegionX_; BackDragListener() = default; ~BackDragListener() override; bool OnDragStart(UIView& view, const DragEvent& event) override; diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/PageTransitionMgr.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/PageTransitionMgr.h index ee3302b43..1e97ebebb 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/PageTransitionMgr.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/PageTransitionMgr.h @@ -154,7 +154,7 @@ private: #endif TransitionCaller transitionCaller_{TransitionCaller::INVALID}; TransitionCaller slideBackCaller_{TransitionCaller::INVALID}; - TransitionTarget slideBackTarget_{0}; + TransitionTarget slideBackTarget_{{0, nullptr, 0}}; bool isTransAnimNeeded_ = false; bool isCurrentSnapShotEnabled_ = false; bool isTargetSnapShotEnabled_ = false; diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/Presenter.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/Presenter.h index b8cbc7a4c..aebc7f946 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/Presenter.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/Presenter.h @@ -24,12 +24,17 @@ public: PresenterBase() : viewBase_(nullptr) {} virtual ~PresenterBase() = default; + /** + * @deprecated ÍÆ¼öʹÓ÷½·¨OnStart(void* data) + */ + virtual void OnStart() {} + /** * @brief Scheduled by slice when it is started and before transition animator starts if exsit * * You can create non-ui resource and update ui based on Model data here */ - virtual void OnStart() {} + virtual void OnStart(void* data) {} /** * @brief Scheduled by slice when it will be visiable and after transition animator ends if exsit diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/RecentManager.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/RecentManager.h index 76e9598db..588d535be 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/RecentManager.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/RecentManager.h @@ -28,7 +28,7 @@ namespace OHOS { typedef struct { bool isNativeSlice; // true: native; false: js union { - uint32_t targetId; + uint32_t targetId; // sliceId + pageId char bundleName[RECENT_APP_BUNDLE_NAME_MAX_LEN]; }; ImageInfo* snapshot; @@ -158,6 +158,11 @@ public: */ uint32_t GetLoadingCnt(); + /** + * @brief Remove a native app with same sliceId. If pageId is same, file will be deleted as well. + */ + bool RemoveNativeRecentApp(uint32_t targetId); + private: RecentManager(); virtual ~RecentManager(); diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/Slice.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/Slice.h index 047cc6085..5d5640f21 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/Slice.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/Slice.h @@ -30,7 +30,7 @@ public: * Its system implemention is in the AbilitySlice, you can define your own processing logic by overriding * Prenseter::OnStart And View::OnStart */ - virtual void OnStart() = 0; + virtual void OnStart(void* data) = 0; /** * @brief Called when the slice will be visible and after transition animator ends if exits * diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageFactory.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageFactory.h index 49dd1c7b0..f81896e66 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageFactory.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageFactory.h @@ -27,6 +27,8 @@ public: void RegisterPage(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage); + void SetMainPage(uint16_t sliceId, uint16_t pageId); + private: SlicePageFactory() {}; ~SlicePageFactory() {}; @@ -64,6 +66,7 @@ public: }; } -#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage) \ - const static OHOS::SlicePageRegister (STATIC_VAR)(sliceId, pageId, new OHOS::SlicePageProxy(), isMainPage) +#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage) \ + const static OHOS::SlicePageRegister(STATIC_VAR##sliceId)( \ + sliceId, pageId, new OHOS::SlicePageProxy(), isMainPage) #endif \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageManager.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageManager.h index c69ef48f4..4308f3064 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageManager.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageManager.h @@ -63,7 +63,9 @@ public: return ((animator_ != nullptr) && (animator_->GetState() != Animator::STOP)); } - void BackToPrevSlicePage(); + bool BackToPrevSlicePage(); + + bool BackToCachedSlicePage(uint16_t pageId); SlicePageManager(const SlicePageManager&) = delete; SlicePageManager& operator=(const SlicePageManager&) = delete; diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/TransitionType.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/TransitionType.h index 0e894b4c6..70e14a968 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/TransitionType.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/TransitionType.h @@ -15,11 +15,18 @@ namespace OHOS { enum class TransitionType { TRANSITION_INVALID = 0, TRANSITION_ZOOM, + TRANSITION_ZOOM_OUT, TRANSITION_HEXAGONS, TRANSITION_BACK_TO_HEXAGONS, TRANSITION_WATERFALL, TRANSITION_BACK_TO_WATERFALL, TRANSITION_ENTER_WATERFALL, + TRANSITION_FADEINOUT, + TRANSITION_TRANSPARENT_GRADIENT, + TRANSITION_GAUSSIAN_BLUR, + TRANSITION_CROSS_SHAPED, + TRANSITION_BACK_TO_CROSS_SHAPED, + TRANSITION_3DFOLD, TRANSITION_MAX, }; @@ -35,8 +42,14 @@ enum class TransitionCaller { INVALID }; +typedef struct { + uint32_t sliceAndPageId; + void *data; + uint16_t dataLength; +} SliceInfo; + typedef union { - uint32_t sliceInfo; // The number of high 16 bits is priority, and the number of low 16 bits is slice id + SliceInfo sliceInfo; // The number of high 16 bits is priority, and the number of low 16 bits is slice id #ifdef JS_ENABLE Want* want; char* bundleName; diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/include/View.h b/code/sdk/application/wearable/n9/nativeabilityfwk/include/View.h index 207926648..e91e6e490 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/include/View.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/include/View.h @@ -46,6 +46,11 @@ public: return backDragListener_; } + /** + * @deprecated 推荐使用方法OnStart(void* data) + */ + virtual void OnStart() {} + /** * @brief Scheduled by slice after funtion SetupView and before transition animator starts if exits. * @@ -58,7 +63,7 @@ public: * AddViewToRootContainer(label_); // add label_ into container * } */ - virtual void OnStart() {} + virtual void OnStart(void* data) {} /** * @brief Scheduled by slice after function TearDownView. diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/Ability.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/Ability.cpp index d9a5baaae..cb173b6e5 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/Ability.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/Ability.cpp @@ -25,6 +25,9 @@ #include "PageTransitionMgr.h" #include "gfx_utils/list.h" #include "AbilitySlice.h" +#include "settings/model/SettingDesktopModel.h" +#include "NativeAbility.h" +#include "power_display_service.h" namespace OHOS { void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy) @@ -42,7 +45,7 @@ void Ability::AddSliceProxy(const uint16_t sliceId, SliceProxy* proxy) allSlicesProxy_.PushBack(proxyPair); } -void Ability::StartSlice(uint32_t targetId) +void Ability::StartSlice(uint32_t targetId, void* data) { if (targetId <= gSliceInvalid) { return; @@ -62,39 +65,19 @@ void Ability::StartSlice(uint32_t targetId) } if (sliceId == defaultTargetId_) { - // 只有在 allSlices_ 为空时才清空,否则保持历史记录 - if (allSlices_.IsEmpty()) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Returning to MAIN slice, allSlices_ is empty, adding main slice"); - allSlices_.PushBack(defaultTargetId_); - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Returning to MAIN slice, preserving history, size: %d", allSlices_.Size()); - // 如果栈顶不是主界面,则添加主界面 - if ((allSlices_[allSlices_.Size() - 1] & SLICE_MASK) != defaultTargetId_) { - allSlices_.PushBack(defaultTargetId_); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Added main slice to stack, new size: %d", allSlices_.Size()); - } - } + allSlices_.Clear(); // clear slice history when return to main slice + allSlices_.PushBack(defaultTargetId_); } else if (PageTransitionMgr::GetInstance().IsBackTransitionRunning()) { - WEARABLE_LOGE - (WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Back transition running, popping from allSlices_, size before: %d", allSlices_.Size()); allSlices_.PopBack(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - allSlices_ size after pop: %d", allSlices_.Size()); } else { - // 检查是否已经在栈顶,避免重复添加相同的界面 - if (allSlices_.IsEmpty() || (allSlices_[allSlices_.Size() - 1] & SLICE_MASK) != sliceId) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Adding new slice %d to allSlices_, size before: %d", targetId, allSlices_.Size()); - allSlices_.PushBack(targetId); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - allSlices_ size after push: %d", allSlices_.Size()); - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "[DEBUG] StartSlice - Slice %d already on top, not adding again, size: %d", sliceId, allSlices_.Size()); - } + allSlices_.PushBack(targetId); } WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StartSlice %d page %d size:%d", sliceId, targetId >> PAGE_OFFSET, allSlices_.Size()); nextSlice_.sliceId = sliceId; nextSlice_.slice = newSlice; - newSlice->OnStart(); + newSlice->OnStart(data); } Ability::ProxyStruct* Ability::Find(const uint16_t sliceId) @@ -139,7 +122,7 @@ void Ability::UpdateCurSlicePageId(uint16_t pageId) allSlices_[allSlices_.Size() - 1] = sliceId | (static_cast(pageId) << PAGE_OFFSET); } -bool Ability::SwitchPageInSlice(uint16_t pageId, void* data, TransitionType type, bool canBack) +bool Ability::SwitchPageInSlice(uint16_t pageId, TransitionType type, bool canBack, void* data, uint16_t dataLength) { if (pageId == 0) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page id should be valid but no zero"); @@ -149,32 +132,99 @@ bool Ability::SwitchPageInSlice(uint16_t pageId, void* data, TransitionType type WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition"); return false; } + if (!GraphicService::IsNativeUITask()) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "SwitchPageInSlice is called not in ui task"); + return false; + } + AbilitySlice* slice = dynamic_cast(curSlice_.slice); + if (slice == nullptr) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr"); + return false; + } + void* sliceData = static_cast(UIMalloc(dataLength)); + memcpy_s(sliceData, dataLength, data, dataLength); + GraphicService::GetInstance()->PostGraphicEvent([slice, pageId, sliceData, type, canBack]() { + slice->ChangeSlicePage(pageId, sliceData, type, canBack); + UIFree(sliceData); + }); + return true; +} + +bool Ability::BackToPrevSlicePage() +{ + if (PageTransitionMgr::GetInstance().IsTransitionRunning()) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition"); + return false; + } + if (!GraphicService::IsNativeUITask()) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToPrevSlicePage is not called in ui task"); + return false; + } AbilitySlice* slice = dynamic_cast(curSlice_.slice); if (slice == nullptr) { WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr"); return false; } - return slice->ChangeSlicePage(pageId, data, type, canBack); + GraphicService::GetInstance()->PostGraphicEvent([slice]() { + slice->BackToPrevSlicePage(); + }); + return true; +} + +bool Ability::BackToCachedSlicePage(uint16_t pageId) +{ + if (PageTransitionMgr::GetInstance().IsTransitionRunning()) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched during transition"); + return false; + } + if (!GraphicService::IsNativeUITask()) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToCachedSlicePage is not called in ui task"); + return false; + } + AbilitySlice* slice = dynamic_cast(curSlice_.slice); + if (slice == nullptr) { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "page can't be switched because current slice is nullptr"); + return false; + } + GraphicService::GetInstance()->PostGraphicEvent([slice, pageId]() { + slice->BackToCachedSlicePage(pageId); + }); + return true; } void Ability::SwitchSlice(uint16_t sliceId, uint16_t pageId, TransitionType type, bool enableSlideBack) { + ExtralConfig config = {pageId, type, enableSlideBack}; + SwitchSliceWithData(sliceId, nullptr, 0, config); +} + +void Ability::SwitchSliceWithData(uint16_t sliceId, void* data, uint16_t dataLength, const ExtralConfig& config) +{ + if (sliceId == VIEW_AOD) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "cannot enter aod by switch slice!"); + return; + } if (Find(sliceId) == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "slice %d is not registered", sliceId); return; } + const power_display_svr_api_t *display_api = power_display_svr_get_api(); + screen_context_t *sc = power_display_get_screen_context(); + if (sc != nullptr && display_api != nullptr && sc->current_state == SCREEN_ON) { + display_api->turn_on_screen(); + } #ifdef JS_ENABLE ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility(); if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) { - OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, type); - targetIdFromJS_ = sliceId | (static_cast(pageId) << PAGE_OFFSET); + OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, config.type); + targetIdFromJS_ = sliceId | (static_cast(config.pageId) << PAGE_OFFSET); FreeElement(elementName); return; } FreeElement(elementName); #endif - - // showsStackSliceId(); + + /* -------------------------------------------------------------------------- */ if (sliceId == VIEW_MAIN) { ClearSliceIdStack(); /*凡是回到主界面都要清空栈*/ @@ -191,16 +241,25 @@ void Ability::SwitchSlice(uint16_t sliceId, uint16_t pageId, TransitionType type if(id!=VIEW_INCOMING_CALL && id!=VIEW_BLUETOOTH_EARPHONE) make_phone_push(id); } + /* -------------------------------------------------------------------------- */ TransitionTarget target; - target.sliceInfo = sliceId | (static_cast(pageId) << PAGE_OFFSET); + target.sliceInfo.sliceAndPageId = sliceId | (static_cast(config.pageId) << PAGE_OFFSET); + void* sliceData = nullptr; + if (dataLength != 0 && data != nullptr) { + sliceData = static_cast(UIMalloc(dataLength)); + memcpy_s(sliceData, dataLength, data, dataLength); + } + target.sliceInfo.data = sliceData; + target.sliceInfo.dataLength = dataLength; bool runImmed = PageTransitionMgr::GetInstance().BeginTransition(TransitionCaller::CHANGE_SLICE, target, - type, enableSlideBack); + config.type, config.enableSlideBack); if (!runImmed) { - printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo, type, enableSlideBack); + printf("pending change slice id:%d type:%d enableSlideBack:%d\n", target.sliceInfo.sliceAndPageId, config.type, config.enableSlideBack); return; } - GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, target.sliceInfo, type)); + GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, + target.sliceInfo.sliceAndPageId, config.type, target.sliceInfo.data)); } void Ability::ChangeSlice(uint16_t sliceId, TransitionType type, @@ -210,21 +269,103 @@ void Ability::ChangeSlice(uint16_t sliceId, TransitionType type, SwitchSlice(sliceId, gPageInvalid, type, enableSlideBack); } -void Ability::PostChangeSlice(uint32_t targetId, TransitionType type) +void Ability::ChangeSliceToApplist() { + if (SettingDesktopModel::GetInstance().GetDesktopStyle() == HEXAGONS_STYLE) { + NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } else if (SettingDesktopModel::GetInstance().GetDesktopStyle() == WATERFALL_STYLE) { + NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_BACK_TO_WATERFALL); + } else { + NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); + } +} + +void Ability::EnterAod() +{ +#ifdef JS_ENABLE + ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility(); + if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) { + OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName); + targetIdFromJS_ = VIEW_AOD | (static_cast(gPageInvalid) << PAGE_OFFSET); + FreeElement(elementName); + return; + } + FreeElement(elementName); +#endif + TransitionTarget target; + target.sliceInfo.sliceAndPageId = VIEW_AOD | (static_cast(gPageInvalid) << PAGE_OFFSET); + target.sliceInfo.data = nullptr; + target.sliceInfo.dataLength = 0; + bool runImmed = PageTransitionMgr::GetInstance().BeginTransition( + TransitionCaller::CHANGE_SLICE, target, TransitionType::TRANSITION_INVALID, false); + if (!runImmed) { + printf("pending change slice id:%d type:%d enableSlideBack:%d\n", + target.sliceInfo.sliceAndPageId, TransitionType::TRANSITION_INVALID, false); + return; + } PauseSlice(); - if (allSlices_.Size() > 0 && allSlices_[allSlices_.Size() - 1] == VIEW_AOD) { - allSlices_.PopBack(); - if (allSlices_.Size() > 0 && (allSlices_[allSlices_.Size() - 1] & SLICE_MASK) == (targetId & SLICE_MASK)) { - allSlices_.PopBack(); + prevAodSlice_ = curSlice_; + curSlice_.slice = nullptr; + curSlice_.sliceId = gSliceInvalid; + ImageCacheManager::GetInstance().EnterAod(); + StartSlice(VIEW_AOD); + ResumeSlice(); + PageTransitionMgr::GetInstance().EndTransition(true); +} + +void Ability::ExitAod(uint32_t targetId) +{ + TransitionTarget target; + target.sliceInfo.sliceAndPageId = targetId; + target.sliceInfo.data = nullptr; + target.sliceInfo.dataLength = 0; + bool runImmed = PageTransitionMgr::GetInstance().BeginTransition( + TransitionCaller::CHANGE_SLICE, target, TransitionType::TRANSITION_INVALID, false); + if (!runImmed) { + printf("pending change slice id:%d type:%d enableSlideBack:%d\n", + target.sliceInfo.sliceAndPageId, TransitionType::TRANSITION_INVALID, false); + return; + } + allSlices_.PopBack(); + PauseSlice(); + StopSlice(); + ImageCacheManager::GetInstance().ExitAod(); + if ((targetId & SLICE_MASK) == prevAodSlice_.sliceId) { // back to prev slice + if (prevAodSlice_.slice != nullptr) { + nextSlice_ = prevAodSlice_; + prevAodSlice_.slice = nullptr; + prevAodSlice_.sliceId = gSliceInvalid; } + InputDeviceManager::GetInstance()->ClearInputDeviceState(); + } else { + if (prevAodSlice_.slice != nullptr) { + WEARABLE_LOGI( + WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Ability StopSlice when exits aod %d", prevAodSlice_.sliceId); + prevAodSlice_.slice->OnStop(); + prevAodSlice_.sliceId = gSliceInvalid; + delete prevAodSlice_.slice; + prevAodSlice_.slice = nullptr; + } + StartSlice(targetId); } + ResumeSlice(); + PageTransitionMgr::GetInstance().EndTransition(true); +} + +void Ability::PostChangeSlice(uint32_t targetId, TransitionType type, void* data) +{ + if (curSlice_.sliceId == VIEW_AOD) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "cannot exit aod by switch slice!"); + PageTransitionMgr::GetInstance().EndTransition(true); + return; + } + PauseSlice(); PageTransitionMgr::GetInstance().SaveCurrentSourceIfNecessary(curSlice_.slice->GetSliceContainer()); if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded() || PageTransitionMgr::GetInstance().IsCurrentSnapshotEnabled()) { StopSlice(); } - StartSlice(targetId); + StartSlice(targetId, data); if (!PageTransitionMgr::GetInstance().IsTransAnimNeeded()) { ResumeSliceWithoutJS(); @@ -232,6 +373,9 @@ void Ability::PostChangeSlice(uint32_t targetId, TransitionType type) PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer()); PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&Ability::ResumeSliceWithoutJS, this)); } + if (data != nullptr) { + UIFree(data); + } } void Ability::ResumeSliceWithoutJS() @@ -304,35 +448,12 @@ void Ability::BackToPreSlice() return; } TransitionTarget target; - target.sliceInfo = targetId; + target.sliceInfo.sliceAndPageId = targetId; + target.sliceInfo.data = nullptr; + target.sliceInfo.dataLength = 0; uint16_t sliceId = static_cast(targetId & SLICE_MASK); uint16_t pageId = static_cast(targetId >> PAGE_OFFSET); PageTransitionMgr::GetInstance().BeginBackTransition(TransitionCaller::CHANGE_SLICE, target); SwitchSlice(sliceId, pageId); } - -bool Ability::Back_CountSlice_make_phone(const TransitionType transitionId, - const uint16_t priority ) { - if(!backStack_.empty()) - { - // 如果此时 backStack_ 栈不为空,取出栈顶的切片 ID ,并调用 ChangeSlice 切换到该切片,返回 true 。 - uint16_t preSlice = backStack_.top(); - backStack_.pop(); - - #ifdef CUSTOM_ZHIHUI - if(preSlice!=VIEW_INCOMING_CALL) - ChangeSlice(preSlice); - else - ChangeSlice(defaultTargetId_); - #endif - return true; - } - else - { - //如果 backStack_ 栈为空,切换到默认切片,返回 false 。 - ChangeSlice(defaultTargetId_); - return false; // 返回false表示无前一个slice,退回到默认slice - } - } - } // namespace OHOS diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/AbilitySlice.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/AbilitySlice.cpp index 7c81e3f32..775fa63d4 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/AbilitySlice.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/AbilitySlice.cpp @@ -14,12 +14,13 @@ #include "View.h" #include "Presenter.h" #include "key/include/KeyInputListener.h" +#include "common/image_cache_manager.h" namespace OHOS { const uint16_t SLICE_MASK = 0xFFFF; const uint32_t PAGE_OFFSET = 16; -void AbilitySlice::OnStart() +void AbilitySlice::OnStart(void* data) { if ((presenter_ == nullptr) || (view_ == nullptr)) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "Presenter or View was nullptr for slice %s", sliceId_); @@ -36,8 +37,10 @@ void AbilitySlice::OnStart() view_->SetupView(); view_->OnStart(); - slicePageMgr_.StartSlicePage(); + view_->OnStart(data); + slicePageMgr_.StartSlicePage(data); presenter_->OnStart(); + presenter_->OnStart(data); state_ = SliceState::START; } @@ -46,7 +49,9 @@ void AbilitySlice::OnResume() if(NativeAbility::GetInstance().GetCurSliceId() == VIEW_MAIN || NativeAbility::GetInstance().GetCurSliceId() == VIEW_APPLIST) { - RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance()); + if (!ImageCacheManager::GetInstance().IsInAod()) { + RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance()); + } } if ((state_ != SliceState::START) && (state_ != SliceState::PAUSE)) { // avoid repeated resume @@ -60,7 +65,9 @@ void AbilitySlice::OnResume() RootView::GetInstance()->Add(view_->GetRootContainer()); } // Reset the default key listener - // RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance()); + // if (!ImageCacheManager::GetInstance().IsInAod()) { + // RootView::GetInstance()->SetOnKeyActListener(KeyInputListener::GetInstance()); + // } NativeAbility::GetInstance().SetCurSlicePriority(gSliceDefaultPriority); UIView* backView = PageTransitionMgr::GetInstance().GetTopSlideBackImage(); @@ -137,4 +144,14 @@ bool AbilitySlice::ChangeSlicePage(uint16_t pageId, void* data, TransitionType t { return slicePageMgr_.ChangeSlicePage(pageId, data, type, canBack); } + +bool AbilitySlice::BackToPrevSlicePage() +{ + return slicePageMgr_.BackToPrevSlicePage(); +} + +bool AbilitySlice::BackToCachedSlicePage(uint16_t pageId) +{ + return slicePageMgr_.BackToCachedSlicePage(pageId); +} } \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp new file mode 100644 index 000000000..6eb9e3b62 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp @@ -0,0 +1,124 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: BackToCrossShapedTransition + * Create: 2025-04 + */ + +#include "applist/AppItemView.h" +#include "animator/easing_equation.h" +#include "common/screen.h" +#include "components/root_view.h" +#include "components/ui_view.h" +#include "TransitionManager.h" +#include "wearable_log.h" +#include "BackToCrossShapedTransition.h" + +namespace OHOS { + static constexpr uint16_t DURATION = 200; + static constexpr int16_t CAMERA_DISTANCE = 600; + static constexpr uint16_t NUM2 = 2; + static constexpr uint16_t HALF_DURATION = DURATION / NUM2; + static constexpr int16_t MIN_OFFSET = 10; + static constexpr int16_t EASE_RANGE = 100; + + REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_CROSS_SHAPED, + BackToCrossShapedTransition, DURATION, true, true); + + void BackToCrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target) + { + if (current == nullptr || target == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToCrossShapedTransition ImageView is empty!"); + return; + } + + currentView_ = current; + targetView_ = target; + + if (cameraView_ == nullptr) { + cameraView_ = new UIImageView(); + } + + screenWidth_ = Screen::GetInstance().GetWidth(); + screenHeight_ = Screen::GetInstance().GetHeight(); + middleHeight_ = screenHeight_ / NUM2; + middleWidth_ = screenWidth_ / NUM2; + + cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_); + cameraView_->SetCameraPosition(Vector2(middleWidth_, middleHeight_)); + cameraView_->SetCameraDistance(CAMERA_DISTANCE); + currentView_->SetVisible(false); + targetView_->SetVisible(false); + RootView::GetInstance()->Add(cameraView_); + } + + void BackToCrossShapedTransition::TransitionAlg(uint32_t time) + { + int16_t offSet = 0; + if (time < HALF_DURATION) { + offSet = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION); + } else { + offSet = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET, + time - HALF_DURATION, DURATION - HALF_DURATION); + } + + UIView* tmpCard = GetVisibleView(offSet); + CommonAlg(tmpCard, offSet); + } + + UIView* BackToCrossShapedTransition::GetVisibleView(int16_t offSet) + { + UIView* view = nullptr; + if (offSet > 0) { + if (offSet < middleWidth_) { + return targetView_; + } + return currentView_; + } else { + if (abs(offSet) < middleWidth_) { + return currentView_; + } + return targetView_; + } + return view; + } + + void BackToCrossShapedTransition::OnTransitionEnd() + { + if (cameraView_ != nullptr) { + RootView::GetInstance()->Remove(cameraView_); + } + + if (targetView_ != nullptr) { + targetView_->SetVisible(true); + } + } + + void BackToCrossShapedTransition::CommonAlg(UIView* visualView, int16_t offSet) + { + if (visualView == nullptr) { + return; + } + + float factor; + if (abs(offSet) < middleWidth_) { + factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(offSet), middleWidth_); + } else { + factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(offSet), middleWidth_); + } + + float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range + float angle = 90 * factor / EASE_RANGE; // 90: quarter cycle degrees + if (visualView != currentView_) { + angle = -angle; + } + + Vector3 scaleCenter = {middleWidth_, middleHeight_, 0}; + Vector3 rotateStart = {middleWidth_, 0, 0}; + Vector3 rotateEnd = {middleWidth_, 2, 0}; + UIView* tmpCard = nullptr; + + cameraView_->SetSrc(static_cast(visualView)->GetImageInfo()); + cameraView_->Scale(Vector3(scale, scale, 0), scaleCenter); + cameraView_->Rotate(angle, rotateStart, rotateEnd); + } +} // namespace OHOS \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h new file mode 100644 index 000000000..8ad17d421 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: BackToCrossShapedTransition + * Create: 2025-04 + */ + +#ifndef BACK_TO_CROSS_SHAPED_TRANSITION_H +#define BACK_TO_CROSS_SHAPED_TRANSITION_H + +#include "TransitionCallback.h" + +namespace OHOS { + class BackToCrossShapedTransition : public TransitionCallback { + public: + BackToCrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) : + TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {} + ~BackToCrossShapedTransition() override {} + + void OnTransitionStart(UIImageView* current, UIImageView* target) override; + void TransitionAlg(uint32_t time) override; + void OnTransitionEnd() override; + private: + + void CommonAlg(UIView* visualView, int16_t offSet); + UIView* GetVisibleView(int16_t offSet); + + UIImageView* currentView_ = nullptr; + UIImageView* targetView_ = nullptr; + UIImageView* cameraView_ = nullptr; + + int16_t middleWidth_; + int16_t middleHeight_; + int16_t screenWidth_; + int16_t screenHeight_; + }; + +} // namespace OHOS + +#endif // BACK_TO_CROSS_SHAPED_TRANSITION_H \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp index 1544233b5..3ccd66e2e 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp @@ -9,12 +9,13 @@ #include "TransitionManager.h" #include "NativeAbility.h" #include "components/root_view.h" -#include "applist/include/AppItemView.h" +#include "applist/HexagonsDesktopFragment.h" #include "hal_tick.h" #include "wearable_log.h" #ifdef JS_ENABLE #include "abilityms_slite_client.h" #endif +#include "TransitionUtils.h" namespace OHOS { REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_HEXAGONS, BackToHexagonsTransition, 300, true, false); @@ -24,7 +25,7 @@ static const float TARGET_SCALE_END = 1.0f; void BackToHexagonsTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target) { current_ = current; - target_ = dynamic_cast(target->GetChildrenHead()); + target_ = dynamic_cast(TransitionUtils::GetViewAndTransparentizePath(target, UI_HEXAGONS_LIST)); if ((target_ == nullptr) || (current_ == nullptr)) { return; } diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp index 7defcd439..f2167b122 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp @@ -9,12 +9,13 @@ #include "TransitionManager.h" #include "NativeAbility.h" #include "components/root_view.h" -#include "applist/include/AppItemView.h" +#include "applist/WaterfallDesktopFragment.h" #include "hal_tick.h" #include "wearable_log.h" #ifdef JS_ENABLE #include "abilityms_slite_client.h" #endif +#include "TransitionUtils.h" namespace OHOS { REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_WATERFALL, BackToWaterfallTransition, 300, true, false); @@ -24,7 +25,7 @@ static const float TARGET_SCALE_END = 1.0f; void BackToWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target) { current_ = current; - target_ = dynamic_cast(target->GetChildrenHead()); + target_ = dynamic_cast(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST)); if ((target_ == nullptr) || (current_ == nullptr)) { return; } diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.cpp new file mode 100644 index 000000000..64a7f768a --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: CrossShapedTransition + * Create: 2025-04 + */ + +#include "applist/AppItemView.h" +#include "animator/easing_equation.h" +#include "common/screen.h" +#include "components/root_view.h" +#include "components/ui_view.h" +#include "TransitionManager.h" +#include "wearable_log.h" +#include "CrossShapedTransition.h" + +namespace OHOS { + static constexpr uint16_t DURATION = 200; + static constexpr uint16_t NUM2 = 2; + static constexpr uint16_t HALF_DURATION = DURATION / NUM2; + static constexpr int16_t CAMERA_DISTANCE = 600; + static constexpr int16_t EASE_RANGE = 100; + static constexpr int16_t MIN_OFFSET = 10; + + REGIST_TRANSITION(TransitionType::TRANSITION_CROSS_SHAPED, CrossShapedTransition, DURATION, true, true); + + void CrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target) + { + if (current == nullptr || target == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "CrossShapedTransition ImageView is empty!"); + return; + } + + currentView_ = current; + targetView_ = target; + + currentView_->SetVisible(false); + targetView_->SetVisible(false); + + if (cameraView_ == nullptr) { + cameraView_ = new UIImageView(); + } + + screenWidth_ = Screen::GetInstance().GetWidth(); + screenHeight_ = Screen::GetInstance().GetHeight(); + + middleWidth_ = screenWidth_ / NUM2; + middleHeight_ = screenHeight_ / NUM2; + + cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_); + cameraView_->SetCameraPosition(Vector2(middleWidth_, middleHeight_)); + cameraView_->SetCameraDistance(CAMERA_DISTANCE); + RootView::GetInstance()->Add(cameraView_); + } + + void CrossShapedTransition::TransitionAlg(uint32_t time) + { + int16_t xOffset = 0; + if (time < HALF_DURATION) { + xOffset = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION); + } else { + xOffset = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET, + time - HALF_DURATION, DURATION - HALF_DURATION); + } + + bool visible = false; // true: current; false: target + UIView* tmpCard = GetVisibleView(xOffset, visible); + CommonAlg(tmpCard, xOffset, visible); + } + + UIView* CrossShapedTransition::GetVisibleView(int16_t xOffset, bool &visible) + { + UIView* view = nullptr; + if (xOffset > 0) { + if (xOffset < middleWidth_) { + view = targetView_; + visible = false; + return view; + } + + view = currentView_; + visible = true; + } else { + if (abs(xOffset) < middleWidth_) { + view = currentView_; + visible = true; + return view; + } + + view = targetView_; + visible = false; + } + + return view; + } + + void CrossShapedTransition::OnTransitionEnd() + { + if (cameraView_ != nullptr) { + RootView::GetInstance()->Remove(cameraView_); + } + + if (targetView_ != nullptr) { + targetView_->SetVisible(true); + } + } + + void CrossShapedTransition::CommonAlg(UIView* visualView, int16_t xOffset, bool visible) + { + if (visualView == nullptr) { + return; + } + + float factor; + if (abs(xOffset) < middleWidth_) { + factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(xOffset), middleWidth_); + } else { + factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(xOffset), middleWidth_); + } + + float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range + float angle = 90 * factor / EASE_RANGE; // 90: quarter cycle degrees + if (visible) { + angle = -angle; + } + + Vector3 scaleCenter = {middleWidth_, middleHeight_, 0}; + Vector3 rotateStart = {middleWidth_, 0, 0}; + Vector3 rotateEnd = {middleWidth_, 2, 0}; + UIView* tmpCard = nullptr; + + cameraView_->SetSrc(static_cast(visualView)->GetImageInfo()); + cameraView_->Scale(Vector3(scale, scale, 0), scaleCenter); + cameraView_->Rotate(angle, rotateStart, rotateEnd); + } +} // namespace OHOS \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.h new file mode 100644 index 000000000..1ff7f5634 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: CrossShapedTransition + * Create: 2025-04 + */ + +#ifndef CROSS_SHAPED_TRANSITION_H +#define CROSS_SHAPED_TRANSITION_H + +#include "TransitionCallback.h" + +namespace OHOS { + class CrossShapedTransition : public TransitionCallback { + public: + CrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) : + TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {} + ~CrossShapedTransition() override {} + + void OnTransitionStart(UIImageView* current, UIImageView* target) override; + void TransitionAlg(uint32_t time) override; + void OnTransitionEnd() override; + private: + + void CommonAlg(UIView* visualView, int16_t xOffset, bool visible); + UIView* GetVisibleView(int16_t xOffset, bool &visible); + + UIImageView* currentView_ = nullptr; + UIImageView* targetView_ = nullptr; + UIImageView* cameraView_ = nullptr; + + int16_t middleWidth_; + int16_t middleHeight_; + int16_t screenWidth_; + int16_t screenHeight_; + }; + +} // namespace OHOS + +#endif // CROSS_SHAPED_TRANSITION_H \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/EnterWaterfallTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/EnterWaterfallTransition.cpp index cc20f4ffc..1d7dd6c5c 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/EnterWaterfallTransition.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/EnterWaterfallTransition.cpp @@ -11,6 +11,7 @@ #include "components/root_view.h" #include "TransitionManager.h" #include "wearable_log.h" +#include "TransitionUtils.h" namespace OHOS { REGIST_TRANSITION(TransitionType::TRANSITION_ENTER_WATERFALL, EnterWaterfallTransition, 300, true, false); @@ -20,7 +21,7 @@ static const float SCALE_END = 1.0f; void EnterWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target) { current_ = current; - target_ = dynamic_cast(target->GetChildrenHead()); + target_ = dynamic_cast(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST)); if ((target_ == nullptr) || (current_ == nullptr)) { return; } diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.cpp new file mode 100644 index 000000000..48634a73e --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.cpp @@ -0,0 +1,73 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: FadeInOutTransition + * Create: 2025-04 + */ + +#include "animator/easing_equation.h" +#include "common/screen.h" +#include "TransitionManager.h" +#include "wearable_log.h" +#include "FadeInOutTransition.h" + +namespace OHOS { +static constexpr int16_t DURA_RANGE = 400; +static constexpr int16_t FADE_IN_END = 300; +static constexpr int16_t FADE_IN_OPASTART = OPA_OPAQUE - 30; +static constexpr int16_t FADE_IN_OPAEND = 0; +static constexpr int16_t FADE_OUT_START = 100; +static constexpr int16_t FADE_OUT_OPASTART = 0; +static constexpr int16_t FADE_OUT_OPAEND = OPA_OPAQUE - 30; +static constexpr int16_t FADE_OPA_DELTA = 15; + +REGIST_TRANSITION(TransitionType::TRANSITION_FADEINOUT, FadeInOutTransition, DURA_RANGE, true, true); + +void FadeInOutTransition::OnTransitionStart(UIImageView* current, UIImageView* target) +{ + if ((current == nullptr) || (target == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n"); + return; + } + current_ = current; + target_ = target; + target_->SetVisible(false); + current_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA); + current_->Invalidate(); + target_->SetOpaScale(0); +} + +void FadeInOutTransition::TransitionAlg(uint32_t time) +{ + if ((current_ == nullptr) || (target_ == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n"); + return; + } + if (time < FADE_IN_END) { + float curFloatOpa = (FADE_IN_OPASTART - FADE_IN_OPAEND) * (FADE_IN_END - time) * 1.0f; + uint8_t curOpa = static_cast (curFloatOpa / FADE_IN_END); + curOpa = curOpa + FADE_IN_OPAEND; + current_->SetOpaScale(curOpa); + current_->Invalidate(); + } + if (time > FADE_OUT_START) { + target_->SetVisible(true); + float curFloatOpa = (FADE_OUT_OPAEND - FADE_OUT_OPASTART) * (time - FADE_OUT_START) * 1.0f; + uint8_t tarOpa = static_cast (curFloatOpa / (DURA_RANGE - FADE_OUT_START)); + tarOpa = tarOpa + FADE_OUT_OPASTART; + target_->SetOpaScale(tarOpa); + target_->Invalidate(); + } +} + +void FadeInOutTransition::OnTransitionEnd() +{ + if ((current_ == nullptr) || (target_ == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n"); + return; + } + current_->SetVisible(false); + target_->SetVisible(true); + target_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA); + target_->Invalidate(); +} +} // namespace OHOS diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.h new file mode 100644 index 000000000..0b1d8a02d --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: FadeInOutTransition + * Create: 2025-04 + */ + +#ifndef FADE_IN_OUT_TRANSITION_H +#define FADE_IN_OUT_TRANSITION_H +#include "TransitionCallback.h" + +namespace OHOS { +class FadeInOutTransition : public TransitionCallback { +public: + FadeInOutTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) : + TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {} + ~FadeInOutTransition() override {} + void OnTransitionStart(UIImageView* current, UIImageView* target) override; + void TransitionAlg(uint32_t time) override; + void OnTransitionEnd() override; +private: + UIImageView* current_ = nullptr; + UIImageView* target_ = nullptr; +}; +} // namespace OHOS +#endif // FADE_IN_OUT_TRANSITION_H \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp new file mode 100644 index 000000000..0f1a21a86 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: GaussianBlurTransition + * Create: 2025-04 + */ + +#include "animator/easing_equation.h" +#include "components/root_view.h" +#include "components/ui_view.h" +#include "TransitionManager.h" +#include "wearable_log.h" +#include "GaussianBlurTransition.h" + +namespace OHOS { + static constexpr int64_t VIEW_COLOR = 0xff505050; + static constexpr uint8_t VIEW_OPACITY = 10; + static constexpr uint64_t VIEW_BLUR_OPACITY = 150; + static constexpr uint8_t BLUR_MIN = 5; + static constexpr float BLUR_MAX = 31.0; + static constexpr int16_t BREAK_TIME = 125; + static constexpr int16_t DURITION = 200; + static constexpr char* BLURVIEW_NAME = "blur"; + + REGIST_TRANSITION(TransitionType::TRANSITION_GAUSSIAN_BLUR, GaussianBlurTransition, DURITION, false, false); + + void GaussianBlurTransition::AddBlurView(UIViewGroup* groupView) + { + if (groupView == nullptr) { + return; + } + + UIView* blurCurent = new UIView(BLURVIEW_NAME); + if (blurCurent == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition new view failed!"); + return; + } + + Rect currRect = groupView->GetVisibleRect(); + blurCurent->SetPosition(currRect.GetX(), currRect.GetY(), currRect.GetWidth(), currRect.GetHeight()); + blurCurent->SetStyle(STYLE_BACKGROUND_COLOR, VIEW_COLOR); + blurCurent->SetStyle(STYLE_BACKGROUND_OPA, VIEW_OPACITY); + + UIView* tailView = groupView->GetChildrenTail(); + if (tailView != nullptr) { + groupView->Insert(tailView, blurCurent); + } + } + + void GaussianBlurTransition::SetViewBlur(UIViewGroup* groupView, float guassScale) + { + if (nullptr == groupView) { + return; + } + + UIView* tailView = groupView->GetChildrenTail(); + if (tailView == nullptr && tailView->GetViewId() != BLURVIEW_NAME) { + return; + } + + UIView* testView = RootView::GetInstance()->GetBlurView(); + RootView::GetInstance()->ClearBlurView(tailView); + tailView->SetBackgroundBlur(guassScale); + tailView->SetStyle(STYLE_BACKGROUND_OPA, VIEW_BLUR_OPACITY); + } + + void GaussianBlurTransition::ClearBlurView(UIViewGroup* groupView) + { + if (groupView == nullptr) { + return; + } + + UIView* tailView = groupView->GetChildrenTail(); + if (tailView != nullptr && tailView->GetViewId() == BLURVIEW_NAME) { + RootView::GetInstance()->ClearBlurView(tailView); + groupView->Remove(tailView); + } + } + + void GaussianBlurTransition::OnTransitionStart(UIViewGroup* current, UIViewGroup* target) + { + if ((current == nullptr) || (target == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition ImageView is empty!"); + return; + } + + current_ = current; + target_ = target; + blurFlag_ = false; + + AddBlurView(current_); + AddBlurView(target_); + target_->SetVisible(false); + } + + void GaussianBlurTransition::TransitionAlg(uint32_t time) + { + if (time <= BREAK_TIME) { + float scale = EasingEquation::QuadEaseIn(BLUR_MIN, static_cast(BLUR_MAX), time,\ + BREAK_TIME)/ BLUR_MAX; + float guassScale = scale * BLUR_MAX; + + SetViewBlur(current_, guassScale); + } else { + if (!blurFlag_) { + UIView* tailView = current_->GetChildrenTail(); + if (tailView != nullptr) { + tailView->ClearBackgroundBlur(); + } + + if (current_->IsVisible()) { + current_->SetVisible(false); + } + + target_->SetVisible(true); + SetViewBlur(target_, BLUR_MAX); + blurFlag_ = true; + return; + } + + float scale = EasingEquation::QuadEaseIn(static_cast(BLUR_MAX), BLUR_MIN, time - BREAK_TIME,\ + DURITION) / BLUR_MAX; + float guassScale = scale * BLUR_MAX; + SetViewBlur(target_, guassScale); + } + } + + void GaussianBlurTransition::OnTransitionEnd() + { + if (current_ == nullptr || target_ == nullptr) { + return; + } + + ClearBlurView(current_); + ClearBlurView(target_); + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.h new file mode 100644 index 000000000..ecbf52991 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: GaussianBlurTransition + * Create: 2025-04 + */ + +#ifndef GAUSSIAN_BLUR_TRANSITION_H +#define GAUSSIAN_BLUR_TRANSITION_H + +#include "TransitionCallback.h" + +namespace OHOS { + class GaussianBlurTransition : public TransitionCallback { + public: + GaussianBlurTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) : + TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {} + ~GaussianBlurTransition() override {} + + void OnTransitionStart(UIViewGroup* current, UIViewGroup* target) override; + void TransitionAlg(uint32_t time) override; + void OnTransitionEnd() override; + private: + + void AddBlurView(UIViewGroup* groupView); + void SetViewBlur(UIViewGroup* groupView, float guassScale); + void ClearBlurView(UIViewGroup* groupView); + + UIViewGroup* current_ = nullptr; + UIViewGroup* target_ = nullptr; + bool blurFlag_; + }; +} // namespace OHOS + +#endif // GAUSSIAN_BLUR_TRANSITION_H \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/HexagonsTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/HexagonsTransition.cpp index 45ebd7616..a76848fd3 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/HexagonsTransition.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/HexagonsTransition.cpp @@ -10,6 +10,7 @@ #include "components/root_view.h" #include "TransitionManager.h" #include "wearable_log.h" +#include "TransitionUtils.h" namespace OHOS { REGIST_TRANSITION(TransitionType::TRANSITION_HEXAGONS, HexagonsTransition, 300, false, true); @@ -20,8 +21,7 @@ static const float TARGET_SCALE_END = 1.0f; void HexagonsTransition::OnTransitionStart(UIViewGroup* current, UIImageView* target) { - current->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); - current_ = dynamic_cast(current->GetChildrenHead()); + current_ = dynamic_cast(TransitionUtils::GetViewAndTransparentizePath(current, UI_HEXAGONS_LIST)); if (current_ == nullptr) { return; } @@ -37,7 +37,6 @@ void HexagonsTransition::OnTransitionStart(UIViewGroup* current, UIImageView* ta WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "HexagonsTransition no focus view\n"); return; } - current_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); Vector2 delta = Vector2(current_->GetWidth() / 2, current_->GetHeight() / 2) - current_->GetCurrentPosition(focusIndex_); opaStart_ = focusView_->GetOpaScale(); diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp new file mode 100644 index 000000000..91e53e929 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: ThreeDFoldTransition + * Create: 2025-04 + */ + +#include "ThreeDFoldTransition.h" +#include "animator/easing_equation.h" +#include "TransitionManager.h" +#include "common/screen.h" +#include "wearable_log.h" +namespace OHOS { +static constexpr int16_t DURA_RANGE = 200; +static const float ROTATE_END = 90.0f; +static constexpr int16_t ROTATE_RANGE_MAX = 90; +static constexpr int16_t CAMERA_DISTANCE = 500; + +REGIST_TRANSITION(TransitionType::TRANSITION_3DFOLD, ThreeDFoldTransition, DURA_RANGE, true, true); +void ThreeDFoldTransition::OnTransitionStart(UIImageView* current, UIImageView* target) +{ + if ((current == nullptr) || (target == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n"); + return; + } + current_ = current; + target_ = target; + current_->SetVisible(true); + target_->SetVisible(true); + + current_->SetCameraPosition(Vector2(current_->GetWidth(), current_->GetHeight() / 2)); // 2: half + current_->SetCameraDistance(CAMERA_DISTANCE); + + target_->SetCameraPosition(Vector2(0, target_->GetHeight() / 2)); // 2: half + target_->SetCameraDistance(CAMERA_DISTANCE); +} + +void ThreeDFoldTransition::TransitionAlg(uint32_t time) +{ + if ((current_ == nullptr) || (target_ == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n"); + return; + } + + int16_t width = Screen::GetInstance().GetWidth(); + float moveOffset = time * 1.0f / (float)DURA_RANGE; + float angle = ROTATE_RANGE_MAX * moveOffset; + + Vector3 currRotateStart = {current_->GetWidth(), current_->GetHeight(), 0}; + Vector3 currRotateEnd = {current_->GetWidth(), 0, 0}; + Vector3 targRotateStart = {0, 0, 0}; + Vector3 targRotateEnd = {0, target_->GetHeight(), 0}; + + current_->Rotate(angle, currRotateStart, currRotateEnd); + current_->SetPosition(-moveOffset * width, current_->GetY()); + + target_->Rotate(ROTATE_RANGE_MAX - angle, targRotateStart, targRotateEnd); + target_->SetPosition((width - moveOffset * width), target_->GetY()); +} + +void ThreeDFoldTransition::OnTransitionEnd() +{ + if ((current_ == nullptr) || (target_ == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n"); + return; + } + current_->SetVisible(false); + target_->SetVisible(true); +} +} // namespace OHOS diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.h new file mode 100644 index 000000000..32f6f95fd --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: ThreeDFoldTransition + * Create: 2025-04 + */ + +#ifndef THREE_D_FOLD_TRANSITION_H +#define THREE_D_FOLD_TRANSITION_H +#include "TransitionCallback.h" + +namespace OHOS { +class ThreeDFoldTransition : public TransitionCallback { +public: + ThreeDFoldTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) : + TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {} + ~ThreeDFoldTransition() override {} + void OnTransitionStart(UIImageView* current, UIImageView* target) override; + void TransitionAlg(uint32_t time) override; + void OnTransitionEnd() override; +private: + UIImageView* current_ = nullptr; + UIImageView* target_ = nullptr; +}; +} // namespace OHOS +#endif // THREE_D_FOLD_TRANSITION_H \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransitionUtils.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransitionUtils.h new file mode 100644 index 000000000..b5b493e5f --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransitionUtils.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025. All rights reserved. + * Description: TransitionUtils + * Author: Hisi Graphic Team + * Created: 2025-10 + */ + +#ifndef TRANSITION_UTILS_H +#define TRANSITION_UTILS_H + +#include "components/ui_view.h" +#include "components/ui_view_group.h" + +namespace OHOS { +class TransitionUtils { +public: + static UIView* GetViewAndTransparentizePath(UIView* current, UIViewType viewType) + { + if (current->GetViewType() == viewType) { + current->SetStyle(STYLE_BACKGROUND_OPA, 0); + return current; + } + + if (!current->IsViewGroup()) { + return nullptr; + } + + UIView* target = nullptr; + UIView* child = dynamic_cast(current)->GetChildrenHead(); + while (child != nullptr) { + target = GetViewAndTransparentizePath(child, viewType); + if (target != nullptr) { + current->SetStyle(STYLE_BACKGROUND_OPA, 0); + break; + } + child = child->GetNextSibling(); + } + return target; + } +}; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp new file mode 100644 index 000000000..d14f3c9d5 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: TransparentGradientTransition + * Create: 2025-04 + */ + +#include "animator/easing_equation.h" +#include "components/root_view.h" +#include "TransitionManager.h" +#include "wearable_log.h" +#include "TransparentGradientTransition.h" + + +namespace OHOS { + static const uint8_t FADE_OUT_OPACITY = 250; + static const uint8_t FADE_IN_OPACITY = 30; + static const uint8_t FADE_DELTA = 200; + static const int16_t FADE_IN_TRANS = 5; + static const int16_t FADE_OUT_TRANS = -5; + static constexpr int16_t OPA_MAX = 255; + + REGIST_TRANSITION(TransitionType::TRANSITION_TRANSPARENT_GRADIENT, TransparentGradientTransition, 400, true, true); + void TransparentGradientTransition::OnTransitionStart(UIImageView* current, UIImageView* target) + { + if ((current == nullptr) || (target == nullptr)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "TransparentGradientTransition ImageView is empty!"); + return; + } + + current_ = current; + target_ = target; + + // currentView fade out + currentOpa_ = FADE_OUT_OPACITY; + transOut_ = 0; + Vector2 transTarget(transIn_, 0); + current_->SetOpaScale(currentOpa_); + + // targeview fade in + transIn_ = FADE_IN_TRANS; + targetOpa_ = FADE_IN_OPACITY; + target_->Translate(transTarget); + target_->SetOpaScale(targetOpa_); + } + + void TransparentGradientTransition::TransitionAlg(uint32_t time) + { + if ((current_ == nullptr) || (target_ == nullptr)) { + return; + } + + float scale = EasingEquation::QuadEaseIn(0, OPA_MAX, time, duration_) / static_cast(OPA_MAX); + uint8_t opa = uint8_t(scale * FADE_DELTA); + currentOpa_ = FADE_OUT_OPACITY - opa; + targetOpa_ = FADE_IN_OPACITY + opa; + transIn_ = FADE_IN_TRANS - int16_t(scale*FADE_IN_TRANS); + transOut_ = int16_t(scale*FADE_OUT_TRANS); + + Vector2 transCurrent(transOut_, 0); + Vector2 transTarget(transIn_, 0); + + current_->Translate(transCurrent); + current_->SetOpaScale(currentOpa_); + + target_->Translate(transTarget); + target_->SetOpaScale(targetOpa_); + } + + void TransparentGradientTransition::OnTransitionEnd() + { + if (current_ == nullptr || target_ == nullptr) { + return; + } + + target_->SetOpaScale(OPA_OPAQUE); + current_->SetOpaScale(OPA_TRANSPARENT); + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.h new file mode 100644 index 000000000..2f03e6840 --- /dev/null +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: TransparentGradientTransition + * Create: 2025-04 + */ + +#ifndef TRANSPARENT_GRADIENT_TRANSITION_H +#define TRANSPARENT_GRADIENT_TRANSITION_H + +#include "TransitionCallback.h" + +namespace OHOS { + class TransparentGradientTransition : public TransitionCallback { + public: + TransparentGradientTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) : + TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {} + ~TransparentGradientTransition() override {} + + void OnTransitionStart(UIImageView* current, UIImageView* target) override; + void TransitionAlg(uint32_t time) override; + void OnTransitionEnd() override; + private: + + UIImageView* current_ = nullptr; + UIImageView* target_ = nullptr; + uint8_t currentOpa_; + uint8_t targetOpa_; + int16_t transIn_; + int16_t transOut_; + }; +} // namespace OHOS + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/WaterfallTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/WaterfallTransition.cpp index 5663f7007..11656bcb0 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/WaterfallTransition.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/WaterfallTransition.cpp @@ -10,6 +10,7 @@ #include "components/root_view.h" #include "TransitionManager.h" #include "wearable_log.h" +#include "TransitionUtils.h" namespace OHOS { REGIST_TRANSITION(TransitionType::TRANSITION_WATERFALL, WaterfallTransition, 300, false, true); @@ -20,8 +21,7 @@ static const float TARGET_SCALE_END = 1.0f; void WaterfallTransition::OnTransitionStart(UIViewGroup* current, UIImageView* target) { - current->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); - current_ = dynamic_cast(current->GetChildrenHead()); + current_ = dynamic_cast(TransitionUtils::GetViewAndTransparentizePath(current, UI_WATERFALL_LIST)); if (current_ == nullptr) { return; } @@ -37,7 +37,6 @@ void WaterfallTransition::OnTransitionStart(UIViewGroup* current, UIImageView* t WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "WaterfallTransition no focus view\n"); return; } - current_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); opaStart_ = focusView_->GetOpaScale(); scaleStart_ = current_->GetGlobalScale(); Rect rect = focusView_->GetRect(); diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.cpp b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.cpp index 233f2761b..9191033db 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.cpp +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.cpp @@ -1,52 +1,44 @@ -/* - * Copyright (c) CompanyNameMagicTag 2023. All rights reserved. - * Description: ZoomTransition - * Author: - * Create: 2023-11 - */ - -#include "ZoomTransition.h" -#include "animator/easing_equation.h" -#include "TransitionManager.h" - -namespace OHOS { -static constexpr int16_t RANGE = 1000; -REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM, ZoomTransition, 800, true, true); - -void ZoomTransition::OnTransitionStart(UIImageView* current, UIImageView* target) -{ - current_ = current; - target_ = target; -} - -void ZoomTransition::TransitionAlg(uint32_t time) -{ - if ((current_ == nullptr) || (target_ == nullptr)) { - return; - } - - float scale; - uint32_t half = duration_ / 2; // 2: half of duration - if (time < half) { - scale = 1 - EasingEquation::QuadEaseOut(0, RANGE, time, half) / static_cast(RANGE); - } else { - scale = EasingEquation::QuadEaseIn(0, RANGE, time - half, half) / static_cast(RANGE); - } - uint8_t opa = scale * OPA_OPAQUE; - if (time < half) { - float centerX = current_->GetX() + current_->GetWidth() / 2.0f; // 2.0: half of width - float centerY = current_->GetY() + current_->GetHeight() / 2.0f; // 2.0: half of height - current_->SetVisible(true); - target_->SetVisible(false); - current_->Scale(Vector2{scale, scale}, Vector2{centerX, centerY}); - current_->SetOpaScale(opa); - } else { - float centerX = target_->GetX() + target_->GetWidth() / 2.0f; // 2.0: half of width - float centerY = target_->GetY() + target_->GetHeight() / 2.0f; // 2.0: half of height - target_->SetVisible(true); - current_->SetVisible(false); - target_->Scale(Vector2{scale, scale}, Vector2{centerX, centerY}); - target_->SetOpaScale(opa); - } -} -} // namespace OHOS +/* + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. + * Description: ZoomTransition + * Create: 2025-04 + */ + +#include "animator/easing_equation.h" +#include "common/screen.h" +#include "TransitionManager.h" +#include "wearable_log.h" +#include "ZoomTransition.h" + +namespace OHOS { +static constexpr uint16_t DURATION = 160; +static constexpr uint16_t OPA_DURATION = 100; +static constexpr float NUM2 = 2.0f; +static constexpr float SCALE_BASE = 1; + +REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM, ZoomTransition, DURATION, true, true); + +void ZoomTransition::OnTransitionStart(UIImageView* current, UIImageView* target) +{ + if (current == nullptr || target == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ZoomTransition ImageView is empty!"); + return; + } + current_ = current; + target_ = target; + middleWidth_ = Screen::GetInstance().GetWidth() / NUM2; + middleHeight_ = Screen::GetInstance().GetHeight() / NUM2; +} + +void ZoomTransition::TransitionAlg(uint32_t time) +{ + float zoom_scale = EasingEquation::LinearEaseNone(0, DURATION, time, duration_) \ + / static_cast(DURATION); + float zoom_out_scale = SCALE_BASE + zoom_scale; + float zoom_in_scale = zoom_scale; + uint8_t opaScale = EasingEquation::CubicEaseOut(OPA_OPAQUE / NUM2, OPA_OPAQUE, time, OPA_DURATION); + current_->Scale(Vector2{zoom_out_scale, zoom_out_scale}, Vector2{middleWidth_, middleHeight_}); + target_->SetOpaScale(opaScale); + target_->Scale(Vector2{zoom_in_scale, zoom_in_scale}, Vector2{middleWidth_, middleHeight_}); +} +} // namespace OHOS diff --git a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.h b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.h index 419f2c086..8b45791e8 100644 --- a/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.h +++ b/code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.h @@ -1,8 +1,7 @@ /* - * Copyright (c) CompanyNameMagicTag 2023. All rights reserved. + * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved. * Description: ZoomTransition - * Author: - * Create: 2023-11 + * Create: 2025-04 */ #ifndef ZOOM_TRANSITION_H @@ -20,6 +19,8 @@ public: private: UIImageView* current_ = nullptr; UIImageView* target_ = nullptr; + float middleWidth_; + float middleHeight_; }; } // namespace OHOS #endif // ZOOM_TRANSITION_H \ No newline at end of file -- 2.17.1