${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
${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
#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.
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
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
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);
void PauseSlice();
void StopSliceTransition();
void BackToPreSlice();
+ void EnterAod();
+ void ExitAod(uint32_t targetId);
/* -------------------------------------------------------------------------- */
/// @brief 当从一个切片(Slice)进入另一个切片时被调用。
}
ChangeSlice(sliceId,transitionId,priority,enableSlideBack); // 切换到新的Slice
}
-
uint16_t GettopSliceId(void) {
if (!backStack_.empty() ) {
return backStack_.top();
}
return 0;
}
-
-
- // 处理后退操作
-
/// @brief 处理后退操作。
/// @param transitionId 切换的动画类型
/// @param priority 切换优先级
return false; // 返回false表示无前一个slice,退回到默认slice
}
}
-
/// @brief 处理后退多级切片的操作。
/// @param count 指定的后退级数
/// @param transitionId 切换的动画类型
}
}
//仅用于打电话结束恢复时使用
- 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())
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;
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。
: sliceId_(targetId & SLICE_MASK), view_(viewBase), presenter_(presenterBase),
slicePageMgr_(targetId), state_(SliceState::UNINITIALIZED) {}
- void OnStart() override;
+ void OnStart(void* data) override;
void OnResume() override;
bool ChangeSlicePage(uint16_t pageId, void* data, TransitionType type, bool canBack);
+ bool BackToPrevSlicePage();
+
+ bool BackToCachedSlicePage(uint16_t pageId);
+
SlicePageManager* GetSlicePageManger()
{
return &slicePageMgr_;
namespace OHOS {
class BackDragListener : public UIView::OnDragListener {
public:
+ static int16_t maxDragRegionX_;
BackDragListener() = default;
~BackDragListener() override;
bool OnDragStart(UIView& view, const DragEvent& event) override;
#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;
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
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;
*/
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();
* 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
*
void RegisterPage(uint16_t sliceId, uint16_t pageId, SlicePageProxyInterface* proxy, bool isMainPage);
+ void SetMainPage(uint16_t sliceId, uint16_t pageId);
+
private:
SlicePageFactory() {};
~SlicePageFactory() {};
};
}
-#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
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;
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,
};
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;
return backDragListener_;
}
+ /**
+ * @deprecated 推荐使用方法OnStart(void* data)
+ */
+ virtual void OnStart() {}
+
/**
* @brief Scheduled by slice after funtion SetupView and before transition animator starts if exits.
*
* AddViewToRootContainer(label_); // add label_ into container
* }
*/
- virtual void OnStart() {}
+ virtual void OnStart(void* data) {}
/**
* @brief Scheduled by slice after function TearDownView.
#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)
allSlicesProxy_.PushBack(proxyPair);
}
-void Ability::StartSlice(uint32_t targetId)
+void Ability::StartSlice(uint32_t targetId, void* data)
{
if (targetId <= gSliceInvalid) {
return;
}
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)
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");
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(); /*凡是回到主界面都要清空栈*/
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,
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();
PageTransitionMgr::GetInstance().SaveTargetSource(nextSlice_.slice->GetSliceContainer());
PageTransitionMgr::GetInstance().StartTransAnim(std::bind(&Ability::ResumeSliceWithoutJS, this));
}
+ if (data != nullptr) {
+ UIFree(data);
+ }
}
void Ability::ResumeSliceWithoutJS()
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
#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_);
view_->SetupView();
view_->OnStart();
- slicePageMgr_.StartSlicePage();
+ view_->OnStart(data);
+ slicePageMgr_.StartSlicePage(data);
presenter_->OnStart();
+ presenter_->OnStart(data);
state_ = SliceState::START;
}
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
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();
{
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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
#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);
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;
}
#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);
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;
}
--- /dev/null
+/*\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
--- /dev/null
+/*\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
#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
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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
#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);
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;
}
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();
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
#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);
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;
}
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();
-/*
- * 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
/*
- * 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
private:
UIImageView* current_ = nullptr;
UIImageView* target_ = nullptr;
+ float middleWidth_;
+ float middleHeight_;
};
} // namespace OHOS
#endif // ZOOM_TRANSITION_H
\ No newline at end of file