application/wearable/nativeabilityfwk文件夹1201patch合并提交 3356/1
authorluozheng <1732036298@qq.com>
Mon, 20 Apr 2026 08:05:32 +0000 (16:05 +0800)
committerluozheng <1732036298@qq.com>
Mon, 20 Apr 2026 08:05:32 +0000 (16:05 +0800)
34 files changed:
code/sdk/application/wearable/n9/nativeabilityfwk/CMakeLists.txt
code/sdk/application/wearable/n9/nativeabilityfwk/include/Ability.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/AbilitySlice.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/BackDragListener.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/PageTransitionMgr.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/Presenter.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/RecentManager.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/Slice.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageFactory.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/SlicePageManager.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/TransitionType.h
code/sdk/application/wearable/n9/nativeabilityfwk/include/View.h
code/sdk/application/wearable/n9/nativeabilityfwk/src/Ability.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/AbilitySlice.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToCrossShapedTransition.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToHexagonsTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/BackToWaterfallTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/CrossShapedTransition.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/EnterWaterfallTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/FadeInOutTransition.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/GaussianBlurTransition.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/HexagonsTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ThreeDFoldTransition.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransitionUtils.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.cpp [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/TransparentGradientTransition.h [new file with mode: 0644]
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/WaterfallTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.cpp
code/sdk/application/wearable/n9/nativeabilityfwk/src/transition/ZoomTransition.h

index b59c597..7a01409 100644 (file)
@@ -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
index bd82b42..13a4f40 100644 (file)
 #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 <b>true</b> if the pages is switched successfully, returns <b>false</b> 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 <b>true</b> if back to cached page successfully, returns <b>false</b> 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 <b>true</b> if back to target cached page successfully, returns <b>false</b> 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 <b>nullptr</b> 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<uint16_t>(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<uint16_t>(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<uint16_t> backStack_;//这个栈会在每次进入一个新的Slice时将其ID压入栈顶,当用户请求后退时,栈顶的Slice ID会被弹出,以此来访问前一个Slice。
index 09a8c81..1e201d7 100644 (file)
@@ -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_;
index 4cca1df..b7f3132 100644 (file)
@@ -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;
index ee3302b..1e97ebe 100644 (file)
@@ -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;
index b8cbc7a..aebc7f9 100644 (file)
@@ -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
index 76e9598..588d535 100644 (file)
@@ -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();
index 047cc60..5d5640f 100644 (file)
@@ -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
      *
index 49dd1c7..f81896e 100644 (file)
@@ -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<V>(), isMainPage)
+#define REGIST_SLICE_PAGE(sliceId, pageId, V, isMainPage)      \
+    const static OHOS::SlicePageRegister(STATIC_VAR##sliceId)( \
+        sliceId, pageId, new OHOS::SlicePageProxy<V>(), isMainPage)
 #endif
\ No newline at end of file
index c69ef48..4308f30 100644 (file)
@@ -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;
index 0e894b4..70e14a9 100644 (file)
@@ -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;
index 2079266..e91e6e4 100644 (file)
@@ -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.
index d9a5baa..cb173b6 100644 (file)
@@ -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<uint32_t>(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<AbilitySlice*>(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<void*>(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<AbilitySlice*>(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<AbilitySlice*>(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<uint32_t>(pageId) << PAGE_OFFSET);
+        OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName, config.type);
+        targetIdFromJS_ = sliceId | (static_cast<uint32_t>(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<uint32_t>(pageId) << PAGE_OFFSET);
+    target.sliceInfo.sliceAndPageId = sliceId | (static_cast<uint32_t>(config.pageId) << PAGE_OFFSET);
+    void* sliceData = nullptr;
+    if (dataLength != 0 && data != nullptr) {
+        sliceData = static_cast<void*>(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<uint32_t>(gPageInvalid) << PAGE_OFFSET);
+        FreeElement(elementName);
+        return;
+    }
+    FreeElement(elementName);
+#endif
+    TransitionTarget target;
+    target.sliceInfo.sliceAndPageId = VIEW_AOD | (static_cast<uint32_t>(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<uint16_t>(targetId & SLICE_MASK);
     uint16_t pageId = static_cast<uint16_t>(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
index 7c81e3f..775fa63 100644 (file)
 #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 (file)
index 0000000..6eb9e3b
--- /dev/null
@@ -0,0 +1,124 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BackToCrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "applist/AppItemView.h"\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "BackToCrossShapedTransition.h"\r
+\r
+namespace OHOS {\r
+    static constexpr uint16_t DURATION = 200;\r
+    static constexpr int16_t CAMERA_DISTANCE = 600;\r
+    static constexpr uint16_t NUM2 = 2;\r
+    static constexpr uint16_t HALF_DURATION = DURATION / NUM2;\r
+    static constexpr int16_t MIN_OFFSET = 10;\r
+    static constexpr int16_t EASE_RANGE = 100;\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_BACK_TO_CROSS_SHAPED,\r
+        BackToCrossShapedTransition, DURATION, true, true);\r
+\r
+    void BackToCrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target)\r
+    {\r
+        if (current == nullptr || target == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "BackToCrossShapedTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        currentView_ = current;\r
+        targetView_ = target;\r
+\r
+        if (cameraView_ == nullptr) {\r
+            cameraView_ = new UIImageView();\r
+        }\r
+\r
+        screenWidth_ = Screen::GetInstance().GetWidth();\r
+        screenHeight_ = Screen::GetInstance().GetHeight();\r
+        middleHeight_ = screenHeight_ / NUM2;\r
+        middleWidth_ = screenWidth_ / NUM2;\r
+\r
+        cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_);\r
+        cameraView_->SetCameraPosition(Vector2<float>(middleWidth_, middleHeight_));\r
+        cameraView_->SetCameraDistance(CAMERA_DISTANCE);\r
+        currentView_->SetVisible(false);\r
+        targetView_->SetVisible(false);\r
+        RootView::GetInstance()->Add(cameraView_);\r
+    }\r
+\r
+    void BackToCrossShapedTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        int16_t offSet = 0;\r
+        if (time < HALF_DURATION) {\r
+            offSet = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION);\r
+        } else {\r
+            offSet = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET,\r
+                                                time - HALF_DURATION, DURATION - HALF_DURATION);\r
+        }\r
+\r
+        UIView* tmpCard = GetVisibleView(offSet);\r
+        CommonAlg(tmpCard, offSet);\r
+    }\r
+\r
+    UIView* BackToCrossShapedTransition::GetVisibleView(int16_t offSet)\r
+    {\r
+        UIView* view = nullptr;\r
+        if (offSet > 0) {\r
+            if (offSet < middleWidth_) {\r
+                return targetView_;\r
+            }\r
+            return currentView_;\r
+        } else {\r
+            if (abs(offSet) < middleWidth_) {\r
+                return currentView_;\r
+            }\r
+            return targetView_;\r
+        }\r
+        return view;\r
+    }\r
+\r
+    void BackToCrossShapedTransition::OnTransitionEnd()\r
+    {\r
+        if (cameraView_ != nullptr) {\r
+            RootView::GetInstance()->Remove(cameraView_);\r
+        }\r
+\r
+        if (targetView_ != nullptr) {\r
+            targetView_->SetVisible(true);\r
+        }\r
+    }\r
+\r
+    void BackToCrossShapedTransition::CommonAlg(UIView* visualView, int16_t offSet)\r
+    {\r
+        if (visualView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        float factor;\r
+        if (abs(offSet) < middleWidth_) {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(offSet), middleWidth_);\r
+        } else {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(offSet), middleWidth_);\r
+        }\r
+\r
+        float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range\r
+        float angle = 90 * factor / EASE_RANGE;        // 90: quarter cycle degrees\r
+        if (visualView != currentView_) {\r
+            angle = -angle;\r
+        }\r
+\r
+        Vector3<float> scaleCenter = {middleWidth_, middleHeight_, 0};\r
+        Vector3<float> rotateStart = {middleWidth_, 0, 0};\r
+        Vector3<float> rotateEnd = {middleWidth_, 2, 0};\r
+        UIView* tmpCard = nullptr;\r
+\r
+        cameraView_->SetSrc(static_cast<UIImageView *>(visualView)->GetImageInfo());\r
+        cameraView_->Scale(Vector3<float>(scale, scale, 0), scaleCenter);\r
+        cameraView_->Rotate(angle, rotateStart, rotateEnd);\r
+    }\r
+} // 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 (file)
index 0000000..8ad17d4
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: BackToCrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef BACK_TO_CROSS_SHAPED_TRANSITION_H\r
+#define BACK_TO_CROSS_SHAPED_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class BackToCrossShapedTransition : public TransitionCallback {\r
+    public:\r
+        BackToCrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~BackToCrossShapedTransition() override {}\r
+\r
+        void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        void CommonAlg(UIView* visualView, int16_t offSet);\r
+        UIView* GetVisibleView(int16_t offSet);\r
+\r
+        UIImageView* currentView_ = nullptr;\r
+        UIImageView* targetView_ = nullptr;\r
+        UIImageView* cameraView_ = nullptr;\r
+\r
+        int16_t middleWidth_;\r
+        int16_t middleHeight_;\r
+        int16_t screenWidth_;\r
+        int16_t screenHeight_;\r
+    };\r
+\r
+} // namespace OHOS\r
+\r
+#endif // BACK_TO_CROSS_SHAPED_TRANSITION_H
\ No newline at end of file
index 1544233..3ccd66e 100644 (file)
@@ -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<UICustomHexagonsList*>(target->GetChildrenHead());
+    target_ = dynamic_cast<UICustomHexagonsList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_HEXAGONS_LIST));
     if ((target_ == nullptr) || (current_ == nullptr)) {
         return;
     }
index 7defcd4..f2167b1 100644 (file)
@@ -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<UIWaterfallList *>(target->GetChildrenHead());
+    target_ = dynamic_cast<UIWaterfallList*>(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 (file)
index 0000000..64a7f76
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "applist/AppItemView.h"\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "CrossShapedTransition.h"\r
+\r
+namespace OHOS {\r
+    static constexpr uint16_t DURATION = 200;\r
+    static constexpr uint16_t NUM2 = 2;\r
+    static constexpr uint16_t HALF_DURATION = DURATION / NUM2;\r
+    static constexpr int16_t CAMERA_DISTANCE = 600;\r
+    static constexpr int16_t EASE_RANGE = 100;\r
+    static constexpr int16_t MIN_OFFSET = 10;\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_CROSS_SHAPED, CrossShapedTransition, DURATION, true, true);\r
+\r
+    void CrossShapedTransition::OnTransitionStart(UIImageView *current, UIImageView *target)\r
+    {\r
+        if (current == nullptr || target == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "CrossShapedTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        currentView_ = current;\r
+        targetView_ = target;\r
+\r
+        currentView_->SetVisible(false);\r
+        targetView_->SetVisible(false);\r
+\r
+        if (cameraView_ == nullptr) {\r
+            cameraView_ = new UIImageView();\r
+        }\r
+\r
+        screenWidth_ = Screen::GetInstance().GetWidth();\r
+        screenHeight_ = Screen::GetInstance().GetHeight();\r
+\r
+        middleWidth_ = screenWidth_ / NUM2;\r
+        middleHeight_ = screenHeight_ / NUM2;\r
+\r
+        cameraView_->SetPosition(0, 0, screenWidth_, screenHeight_);\r
+        cameraView_->SetCameraPosition(Vector2<float>(middleWidth_, middleHeight_));\r
+        cameraView_->SetCameraDistance(CAMERA_DISTANCE);\r
+        RootView::GetInstance()->Add(cameraView_);\r
+    }\r
+\r
+    void CrossShapedTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        int16_t xOffset = 0;\r
+        if (time < HALF_DURATION) {\r
+            xOffset = EasingEquation::QuadEaseIn(-MIN_OFFSET, -middleWidth_, time, HALF_DURATION);\r
+        } else {\r
+            xOffset = EasingEquation::QuadEaseIn(middleWidth_, MIN_OFFSET,\r
+                                                 time - HALF_DURATION, DURATION - HALF_DURATION);\r
+        }\r
+\r
+        bool visible = false; // true: current; false: target\r
+        UIView* tmpCard = GetVisibleView(xOffset, visible);\r
+        CommonAlg(tmpCard, xOffset, visible);\r
+    }\r
+\r
+    UIView* CrossShapedTransition::GetVisibleView(int16_t xOffset, bool &visible)\r
+    {\r
+        UIView* view = nullptr;\r
+        if (xOffset > 0) {\r
+            if (xOffset < middleWidth_) {\r
+                view = targetView_;\r
+                visible = false;\r
+                return view;\r
+            }\r
+\r
+            view = currentView_;\r
+            visible = true;\r
+        } else {\r
+            if (abs(xOffset) < middleWidth_) {\r
+                view = currentView_;\r
+                visible = true;\r
+                return view;\r
+            }\r
+\r
+            view = targetView_;\r
+            visible = false;\r
+        }\r
+\r
+        return view;\r
+    }\r
+\r
+    void CrossShapedTransition::OnTransitionEnd()\r
+    {\r
+        if (cameraView_ != nullptr) {\r
+            RootView::GetInstance()->Remove(cameraView_);\r
+        }\r
+\r
+        if (targetView_ != nullptr) {\r
+            targetView_->SetVisible(true);\r
+        }\r
+    }\r
+\r
+    void CrossShapedTransition::CommonAlg(UIView* visualView, int16_t xOffset, bool visible)\r
+    {\r
+        if (visualView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        float factor;\r
+        if (abs(xOffset) < middleWidth_) {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(xOffset), middleWidth_);\r
+        } else {\r
+            factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, screenWidth_ - abs(xOffset), middleWidth_);\r
+        }\r
+\r
+        float scale = 1.0 - 0.2 * factor / EASE_RANGE; // 0.2: scale range\r
+        float angle = 90 * factor / EASE_RANGE;        // 90: quarter cycle degrees\r
+        if (visible) {\r
+            angle = -angle;\r
+        }\r
+\r
+        Vector3<float> scaleCenter = {middleWidth_, middleHeight_, 0};\r
+        Vector3<float> rotateStart = {middleWidth_, 0, 0};\r
+        Vector3<float> rotateEnd = {middleWidth_, 2, 0};\r
+        UIView* tmpCard = nullptr;\r
+\r
+        cameraView_->SetSrc(static_cast<UIImageView *>(visualView)->GetImageInfo());\r
+        cameraView_->Scale(Vector3<float>(scale, scale, 0), scaleCenter);\r
+        cameraView_->Rotate(angle, rotateStart, rotateEnd);\r
+    }\r
+} // 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 (file)
index 0000000..1ff7f56
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: CrossShapedTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef CROSS_SHAPED_TRANSITION_H\r
+#define CROSS_SHAPED_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class CrossShapedTransition : public TransitionCallback {\r
+    public:\r
+        CrossShapedTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~CrossShapedTransition() override {}\r
+\r
+        void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        void CommonAlg(UIView* visualView, int16_t xOffset, bool visible);\r
+        UIView* GetVisibleView(int16_t xOffset, bool &visible);\r
+\r
+        UIImageView* currentView_ = nullptr;\r
+        UIImageView* targetView_ = nullptr;\r
+        UIImageView* cameraView_ = nullptr;\r
+\r
+        int16_t middleWidth_;\r
+        int16_t middleHeight_;\r
+        int16_t screenWidth_;\r
+        int16_t screenHeight_;\r
+    };\r
+\r
+} // namespace OHOS\r
+\r
+#endif // CROSS_SHAPED_TRANSITION_H
\ No newline at end of file
index cc20f4f..1d7dd6c 100644 (file)
@@ -11,6 +11,7 @@
 #include "components/root_view.h"\r
 #include "TransitionManager.h"\r
 #include "wearable_log.h"\r
+#include "TransitionUtils.h"\r
 \r
 namespace OHOS {\r
 REGIST_TRANSITION(TransitionType::TRANSITION_ENTER_WATERFALL, EnterWaterfallTransition, 300, true, false);\r
@@ -20,7 +21,7 @@ static const float SCALE_END = 1.0f;
 void EnterWaterfallTransition::OnTransitionStart(UIImageView* current, UIViewGroup* target)\r
 {\r
     current_ = current;\r
-    target_ = dynamic_cast<UIWaterfallList*>(target->GetChildrenHead());\r
+    target_ = dynamic_cast<UIWaterfallList*>(TransitionUtils::GetViewAndTransparentizePath(target, UI_WATERFALL_LIST));\r
     if ((target_ == nullptr) || (current_ == nullptr)) {\r
         return;\r
     }\r
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 (file)
index 0000000..48634a7
--- /dev/null
@@ -0,0 +1,73 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FadeInOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "FadeInOutTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr int16_t DURA_RANGE = 400;\r
+static constexpr int16_t FADE_IN_END = 300;\r
+static constexpr int16_t FADE_IN_OPASTART = OPA_OPAQUE - 30;\r
+static constexpr int16_t FADE_IN_OPAEND = 0;\r
+static constexpr int16_t FADE_OUT_START = 100;\r
+static constexpr int16_t FADE_OUT_OPASTART = 0;\r
+static constexpr int16_t FADE_OUT_OPAEND = OPA_OPAQUE - 30;\r
+static constexpr int16_t FADE_OPA_DELTA = 15;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_FADEINOUT, FadeInOutTransition, DURA_RANGE, true, true);\r
+\r
+void FadeInOutTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if ((current == nullptr) || (target == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_ = current;\r
+    target_ = target;\r
+    target_->SetVisible(false);\r
+    current_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA);\r
+    current_->Invalidate();\r
+    target_->SetOpaScale(0);\r
+}\r
+\r
+void FadeInOutTransition::TransitionAlg(uint32_t time)\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+        return;\r
+    }\r
+    if (time < FADE_IN_END) {\r
+        float curFloatOpa = (FADE_IN_OPASTART - FADE_IN_OPAEND) * (FADE_IN_END - time) * 1.0f;\r
+        uint8_t curOpa = static_cast<uint8_t> (curFloatOpa / FADE_IN_END);\r
+        curOpa = curOpa + FADE_IN_OPAEND;\r
+        current_->SetOpaScale(curOpa);\r
+        current_->Invalidate();\r
+    }\r
+    if (time > FADE_OUT_START) {\r
+        target_->SetVisible(true);\r
+        float curFloatOpa = (FADE_OUT_OPAEND - FADE_OUT_OPASTART)  * (time - FADE_OUT_START) * 1.0f;\r
+        uint8_t tarOpa = static_cast<uint8_t> (curFloatOpa / (DURA_RANGE - FADE_OUT_START));\r
+        tarOpa = tarOpa + FADE_OUT_OPASTART;\r
+        target_->SetOpaScale(tarOpa);\r
+        target_->Invalidate();\r
+    }\r
+}\r
+\r
+void FadeInOutTransition::OnTransitionEnd()\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "FadeInOutTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_->SetVisible(false);\r
+    target_->SetVisible(true);\r
+    target_->SetOpaScale(OPA_OPAQUE - FADE_OPA_DELTA);\r
+    target_->Invalidate();\r
+}\r
+} // namespace OHOS\r
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 (file)
index 0000000..0b1d8a0
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: FadeInOutTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef FADE_IN_OUT_TRANSITION_H\r
+#define FADE_IN_OUT_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class FadeInOutTransition : public TransitionCallback {\r
+public:\r
+    FadeInOutTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+    ~FadeInOutTransition() override {}\r
+    void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+    void TransitionAlg(uint32_t time) override;\r
+    void OnTransitionEnd() override;\r
+private:\r
+    UIImageView* current_ = nullptr;\r
+    UIImageView* target_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#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 (file)
index 0000000..0f1a21a
--- /dev/null
@@ -0,0 +1,136 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GaussianBlurTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "components/root_view.h"\r
+#include "components/ui_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "GaussianBlurTransition.h"\r
+\r
+namespace OHOS {\r
+    static constexpr int64_t VIEW_COLOR = 0xff505050;\r
+    static constexpr uint8_t VIEW_OPACITY = 10;\r
+    static constexpr uint64_t VIEW_BLUR_OPACITY = 150;\r
+    static constexpr uint8_t BLUR_MIN = 5;\r
+    static constexpr float BLUR_MAX = 31.0;\r
+    static constexpr int16_t BREAK_TIME = 125;\r
+    static constexpr int16_t DURITION = 200;\r
+    static constexpr char* BLURVIEW_NAME = "blur";\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_GAUSSIAN_BLUR, GaussianBlurTransition, DURITION, false, false);\r
+\r
+    void GaussianBlurTransition::AddBlurView(UIViewGroup* groupView)\r
+    {\r
+        if (groupView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        UIView* blurCurent = new UIView(BLURVIEW_NAME);\r
+        if (blurCurent == nullptr) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition new view failed!");\r
+            return;\r
+        }\r
+\r
+        Rect currRect = groupView->GetVisibleRect();\r
+        blurCurent->SetPosition(currRect.GetX(), currRect.GetY(), currRect.GetWidth(), currRect.GetHeight());\r
+        blurCurent->SetStyle(STYLE_BACKGROUND_COLOR, VIEW_COLOR);\r
+        blurCurent->SetStyle(STYLE_BACKGROUND_OPA, VIEW_OPACITY);\r
+\r
+        UIView* tailView = groupView->GetChildrenTail();\r
+        if (tailView != nullptr) {\r
+            groupView->Insert(tailView, blurCurent);\r
+        }\r
+    }\r
+\r
+    void GaussianBlurTransition::SetViewBlur(UIViewGroup* groupView, float guassScale)\r
+    {\r
+        if (nullptr == groupView) {\r
+            return;\r
+        }\r
+\r
+        UIView* tailView = groupView->GetChildrenTail();\r
+        if (tailView == nullptr && tailView->GetViewId() != BLURVIEW_NAME) {\r
+            return;\r
+        }\r
+\r
+        UIView* testView = RootView::GetInstance()->GetBlurView();\r
+        RootView::GetInstance()->ClearBlurView(tailView);\r
+        tailView->SetBackgroundBlur(guassScale);\r
+        tailView->SetStyle(STYLE_BACKGROUND_OPA, VIEW_BLUR_OPACITY);\r
+    }\r
+\r
+    void GaussianBlurTransition::ClearBlurView(UIViewGroup* groupView)\r
+    {\r
+        if (groupView == nullptr) {\r
+            return;\r
+        }\r
+\r
+        UIView* tailView = groupView->GetChildrenTail();\r
+        if (tailView != nullptr && tailView->GetViewId() == BLURVIEW_NAME) {\r
+            RootView::GetInstance()->ClearBlurView(tailView);\r
+            groupView->Remove(tailView);\r
+        }\r
+    }\r
+\r
+    void GaussianBlurTransition::OnTransitionStart(UIViewGroup* current, UIViewGroup* target)\r
+    {\r
+        if ((current == nullptr) || (target == nullptr)) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_AAFWK, "GaussianBlurTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        current_ = current;\r
+        target_ = target;\r
+        blurFlag_ = false;\r
+\r
+        AddBlurView(current_);\r
+        AddBlurView(target_);\r
+        target_->SetVisible(false);\r
+    }\r
+\r
+    void GaussianBlurTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        if (time <= BREAK_TIME) {\r
+            float scale = EasingEquation::QuadEaseIn(BLUR_MIN, static_cast<int16_t>(BLUR_MAX), time,\\r
+                                                     BREAK_TIME)/ BLUR_MAX;\r
+            float guassScale = scale * BLUR_MAX;\r
+\r
+            SetViewBlur(current_, guassScale);\r
+        } else {\r
+            if (!blurFlag_) {\r
+                UIView* tailView = current_->GetChildrenTail();\r
+                if (tailView != nullptr) {\r
+                    tailView->ClearBackgroundBlur();\r
+                }\r
+\r
+                if (current_->IsVisible()) {\r
+                    current_->SetVisible(false);\r
+                }\r
+\r
+                target_->SetVisible(true);\r
+                SetViewBlur(target_, BLUR_MAX);\r
+                blurFlag_ = true;\r
+                return;\r
+            }\r
+\r
+            float scale = EasingEquation::QuadEaseIn(static_cast<int16_t>(BLUR_MAX), BLUR_MIN, time - BREAK_TIME,\\r
+                                                     DURITION) / BLUR_MAX;\r
+            float guassScale = scale * BLUR_MAX;\r
+            SetViewBlur(target_, guassScale);\r
+        }\r
+    }\r
+\r
+    void GaussianBlurTransition::OnTransitionEnd()\r
+    {\r
+        if (current_ == nullptr || target_ == nullptr) {\r
+            return;\r
+        }\r
+\r
+        ClearBlurView(current_);\r
+        ClearBlurView(target_);\r
+    }\r
+}
\ 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 (file)
index 0000000..ecbf529
--- /dev/null
@@ -0,0 +1,34 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: GaussianBlurTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef GAUSSIAN_BLUR_TRANSITION_H\r
+#define GAUSSIAN_BLUR_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class GaussianBlurTransition : public TransitionCallback {\r
+    public:\r
+        GaussianBlurTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~GaussianBlurTransition() override {}\r
+\r
+        void OnTransitionStart(UIViewGroup* current, UIViewGroup* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        void AddBlurView(UIViewGroup* groupView);\r
+        void SetViewBlur(UIViewGroup* groupView, float guassScale);\r
+        void ClearBlurView(UIViewGroup* groupView);\r
+\r
+        UIViewGroup* current_ = nullptr;\r
+        UIViewGroup* target_ = nullptr;\r
+        bool blurFlag_;\r
+    };\r
+} // namespace OHOS\r
+\r
+#endif // GAUSSIAN_BLUR_TRANSITION_H
\ No newline at end of file
index 45ebd76..a76848f 100644 (file)
@@ -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<UICustomHexagonsList*>(current->GetChildrenHead());
+    current_ = dynamic_cast<UICustomHexagonsList*>(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<int16_t> delta = Vector2<int16_t>(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 (file)
index 0000000..91e53e9
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ThreeDFoldTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "ThreeDFoldTransition.h"\r
+#include "animator/easing_equation.h"\r
+#include "TransitionManager.h"\r
+#include "common/screen.h"\r
+#include "wearable_log.h"\r
+namespace OHOS {\r
+static constexpr int16_t DURA_RANGE = 200;\r
+static const float ROTATE_END = 90.0f;\r
+static constexpr int16_t ROTATE_RANGE_MAX = 90;\r
+static constexpr int16_t CAMERA_DISTANCE = 500;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_3DFOLD, ThreeDFoldTransition, DURA_RANGE, true, true);\r
+void ThreeDFoldTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if ((current == nullptr) || (target == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_ = current;\r
+    target_ = target;\r
+    current_->SetVisible(true);\r
+    target_->SetVisible(true);\r
+\r
+    current_->SetCameraPosition(Vector2<float>(current_->GetWidth(), current_->GetHeight() / 2)); // 2: half\r
+    current_->SetCameraDistance(CAMERA_DISTANCE);\r
+ \r
+    target_->SetCameraPosition(Vector2<float>(0, target_->GetHeight() / 2)); // 2: half\r
+    target_->SetCameraDistance(CAMERA_DISTANCE);\r
+}\r
+\r
+void ThreeDFoldTransition::TransitionAlg(uint32_t time)\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+        return;\r
+    }\r
+\r
+    int16_t width = Screen::GetInstance().GetWidth();\r
+    float moveOffset = time * 1.0f / (float)DURA_RANGE;\r
+    float angle = ROTATE_RANGE_MAX * moveOffset;\r
+\r
+    Vector3<float> currRotateStart = {current_->GetWidth(), current_->GetHeight(), 0};\r
+    Vector3<float> currRotateEnd = {current_->GetWidth(), 0, 0};\r
+    Vector3<float> targRotateStart = {0, 0, 0};\r
+    Vector3<float> targRotateEnd = {0, target_->GetHeight(), 0};\r
+\r
+    current_->Rotate(angle, currRotateStart, currRotateEnd);\r
+    current_->SetPosition(-moveOffset * width, current_->GetY());\r
+\r
+    target_->Rotate(ROTATE_RANGE_MAX - angle, targRotateStart, targRotateEnd);\r
+    target_->SetPosition((width - moveOffset * width), target_->GetY());\r
+}\r
+\r
+void ThreeDFoldTransition::OnTransitionEnd()\r
+{\r
+    if ((current_ == nullptr) || (target_ == nullptr)) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ThreeDFoldTransition no current or target\n");\r
+        return;\r
+    }\r
+    current_->SetVisible(false);\r
+    target_->SetVisible(true);\r
+}\r
+} // namespace OHOS\r
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 (file)
index 0000000..32f6f95
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ThreeDFoldTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef THREE_D_FOLD_TRANSITION_H\r
+#define THREE_D_FOLD_TRANSITION_H\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+class ThreeDFoldTransition : public TransitionCallback {\r
+public:\r
+    ThreeDFoldTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+        TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+    ~ThreeDFoldTransition() override {}\r
+    void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+    void TransitionAlg(uint32_t time) override;\r
+    void OnTransitionEnd() override;\r
+private:\r
+    UIImageView* current_ = nullptr;\r
+    UIImageView* target_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#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 (file)
index 0000000..b5b493e
--- /dev/null
@@ -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<UIViewGroup*>(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 (file)
index 0000000..d14f3c9
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TransparentGradientTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "components/root_view.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "TransparentGradientTransition.h"\r
+\r
+\r
+namespace OHOS {\r
+    static const uint8_t FADE_OUT_OPACITY = 250;\r
+    static const uint8_t FADE_IN_OPACITY = 30;\r
+    static const uint8_t FADE_DELTA = 200;\r
+    static const int16_t FADE_IN_TRANS = 5;\r
+    static const int16_t FADE_OUT_TRANS = -5;\r
+    static constexpr int16_t OPA_MAX = 255;\r
+\r
+    REGIST_TRANSITION(TransitionType::TRANSITION_TRANSPARENT_GRADIENT, TransparentGradientTransition, 400, true, true);\r
+    void TransparentGradientTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+    {\r
+        if ((current == nullptr) || (target == nullptr)) {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "TransparentGradientTransition ImageView is empty!");\r
+            return;\r
+        }\r
+\r
+        current_ = current;\r
+        target_ = target;\r
+\r
+        // currentView fade out\r
+        currentOpa_ = FADE_OUT_OPACITY;\r
+        transOut_ = 0;\r
+        Vector2<int16_t> transTarget(transIn_, 0);\r
+        current_->SetOpaScale(currentOpa_);\r
+\r
+        // targeview fade in\r
+        transIn_ = FADE_IN_TRANS;\r
+        targetOpa_ = FADE_IN_OPACITY;\r
+        target_->Translate(transTarget);\r
+        target_->SetOpaScale(targetOpa_);\r
+    }\r
+\r
+    void TransparentGradientTransition::TransitionAlg(uint32_t time)\r
+    {\r
+        if ((current_ == nullptr) || (target_ == nullptr)) {\r
+            return;\r
+        }\r
+\r
+        float scale = EasingEquation::QuadEaseIn(0, OPA_MAX, time, duration_) / static_cast<float>(OPA_MAX);\r
+        uint8_t opa = uint8_t(scale * FADE_DELTA);\r
+        currentOpa_ = FADE_OUT_OPACITY - opa;\r
+        targetOpa_ = FADE_IN_OPACITY + opa;\r
+        transIn_ = FADE_IN_TRANS - int16_t(scale*FADE_IN_TRANS);\r
+        transOut_ = int16_t(scale*FADE_OUT_TRANS);\r
+\r
+        Vector2<int16_t> transCurrent(transOut_, 0);\r
+        Vector2<int16_t> transTarget(transIn_, 0);\r
+\r
+        current_->Translate(transCurrent);\r
+        current_->SetOpaScale(currentOpa_);\r
+\r
+        target_->Translate(transTarget);\r
+        target_->SetOpaScale(targetOpa_);\r
+    }\r
+\r
+    void TransparentGradientTransition::OnTransitionEnd()\r
+    {\r
+        if (current_ == nullptr || target_ == nullptr) {\r
+            return;\r
+        }\r
+\r
+        target_->SetOpaScale(OPA_OPAQUE);\r
+        current_->SetOpaScale(OPA_TRANSPARENT);\r
+    }\r
+}
\ 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 (file)
index 0000000..2f03e68
--- /dev/null
@@ -0,0 +1,33 @@
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: TransparentGradientTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#ifndef TRANSPARENT_GRADIENT_TRANSITION_H\r
+#define TRANSPARENT_GRADIENT_TRANSITION_H\r
+\r
+#include "TransitionCallback.h"\r
+\r
+namespace OHOS {\r
+    class TransparentGradientTransition : public TransitionCallback {\r
+    public:\r
+        TransparentGradientTransition(uint32_t time, bool enableCurrentSnapshot, bool enableTargetSnapshot) :\r
+            TransitionCallback(time, enableCurrentSnapshot, enableTargetSnapshot) {}\r
+        ~TransparentGradientTransition() override {}\r
+\r
+        void OnTransitionStart(UIImageView* current, UIImageView* target) override;\r
+        void TransitionAlg(uint32_t time) override;\r
+        void OnTransitionEnd() override;\r
+    private:\r
+\r
+        UIImageView* current_ = nullptr;\r
+        UIImageView* target_ = nullptr;\r
+        uint8_t currentOpa_;\r
+        uint8_t targetOpa_;\r
+        int16_t transIn_;\r
+        int16_t transOut_;\r
+    };\r
+} // namespace OHOS\r
+\r
+#endif
\ No newline at end of file
index 5663f70..11656bc 100644 (file)
@@ -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<UIWaterfallList*>(current->GetChildrenHead());
+    current_ = dynamic_cast<UIWaterfallList*>(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();
index 233f276..9191033 100644 (file)
@@ -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<float>(RANGE);
-    } else {
-        scale = EasingEquation::QuadEaseIn(0, RANGE, time - half, half) / static_cast<float>(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<float>{scale, scale}, Vector2<float>{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<float>{scale, scale}, Vector2<float>{centerX, centerY});
-        target_->SetOpaScale(opa);
-    }
-}
-} // namespace OHOS
+/*\r
+ * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2025-2025. All rights reserved.\r
+ * Description: ZoomTransition\r
+ * Create: 2025-04\r
+ */\r
+\r
+#include "animator/easing_equation.h"\r
+#include "common/screen.h"\r
+#include "TransitionManager.h"\r
+#include "wearable_log.h"\r
+#include "ZoomTransition.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint16_t DURATION = 160;\r
+static constexpr uint16_t OPA_DURATION = 100;\r
+static constexpr float NUM2 = 2.0f;\r
+static constexpr float SCALE_BASE = 1;\r
+\r
+REGIST_TRANSITION(TransitionType::TRANSITION_ZOOM, ZoomTransition, DURATION, true, true);\r
+\r
+void ZoomTransition::OnTransitionStart(UIImageView* current, UIImageView* target)\r
+{\r
+    if (current == nullptr || target == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "ZoomTransition ImageView is empty!");\r
+        return;\r
+    }\r
+    current_ = current;\r
+    target_ = target;\r
+    middleWidth_ = Screen::GetInstance().GetWidth() / NUM2;\r
+    middleHeight_ = Screen::GetInstance().GetHeight() / NUM2;\r
+}\r
+\r
+void ZoomTransition::TransitionAlg(uint32_t time)\r
+{\r
+    float zoom_scale = EasingEquation::LinearEaseNone(0, DURATION, time, duration_) \\r
+                                        / static_cast<float>(DURATION);\r
+    float zoom_out_scale = SCALE_BASE + zoom_scale;\r
+    float zoom_in_scale = zoom_scale;\r
+    uint8_t opaScale = EasingEquation::CubicEaseOut(OPA_OPAQUE / NUM2, OPA_OPAQUE, time, OPA_DURATION);\r
+    current_->Scale(Vector2<float>{zoom_out_scale, zoom_out_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+    target_->SetOpaScale(opaScale);\r
+    target_->Scale(Vector2<float>{zoom_in_scale, zoom_in_scale}, Vector2<float>{middleWidth_, middleHeight_});\r
+}\r
+} // namespace OHOS\r
index 419f2c0..8b45791 100644 (file)
@@ -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