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