From 3eddfe0bd0414a178aecebc1e48eb6342c72904e Mon Sep 17 00:00:00 2001 From: limeng Date: Wed, 18 Oct 2023 16:56:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=95=BF=E6=8C=89=E6=82=AC=E6=B5=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95Preview=E6=94=AF=E6=8C=81=E6=8B=96=E6=8B=BD=E5=8A=A8?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: limeng --- .../entrance/subwindow/subwindow_ohos.cpp | 4 +-- .../ohos/entrance/subwindow/subwindow_ohos.h | 2 +- frameworks/base/subwindow/subwindow.h | 2 +- .../base/subwindow/subwindow_manager.cpp | 4 +-- frameworks/base/subwindow/subwindow_manager.h | 2 +- .../base/test/mock/mock_subwindow_manager.cpp | 2 +- .../core/components_ng/event/drag_event.cpp | 18 +++++++++++- .../pattern/menu/menu_layout_algorithm.cpp | 12 ++++---- .../components_ng/pattern/menu/menu_theme.h | 14 +++++++++ .../components_ng/pattern/menu/menu_view.cpp | 29 +++++++++++++++++-- .../menu/preview/menu_preview_pattern.cpp | 11 +++++++ .../pattern/overlay/overlay_manager.cpp | 15 ++++++---- .../pattern/overlay/overlay_manager.h | 4 +-- test/mock/base/mock_subwindow.h | 2 +- 14 files changed, 96 insertions(+), 25 deletions(-) diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp index b3cdd031a26..408ed176892 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp @@ -494,7 +494,7 @@ void SubwindowOhos::ShowMenuNG(const RefPtr menuNode, int32_t tar overlay->ShowMenuInSubWindow(targetId, offset, menuNode); } -void SubwindowOhos::HideMenuNG(bool showPreviewAnimation) +void SubwindowOhos::HideMenuNG(bool showPreviewAnimation, bool startDrag) { if (!isShowed_) { return; @@ -508,7 +508,7 @@ void SubwindowOhos::HideMenuNG(bool showPreviewAnimation) auto overlay = context->GetOverlayManager(); CHECK_NULL_VOID(overlay); ContainerScope scope(childContainerId_); - overlay->HideMenuInSubWindow(showPreviewAnimation); + overlay->HideMenuInSubWindow(showPreviewAnimation, startDrag); } void SubwindowOhos::HideMenuNG(const RefPtr& menu, int32_t targetId) diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.h b/adapter/ohos/entrance/subwindow/subwindow_ohos.h index 8456c47ef38..c82e407e0a0 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.h +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.h @@ -60,7 +60,7 @@ public: void ShowMenu(const RefPtr& newComponent) override; void ShowMenuNG(const RefPtr menuNode, int32_t targetId, const NG::OffsetF& offset) override; void HideMenuNG(const RefPtr& menu, int32_t targetId) override; - void HideMenuNG(bool showPreviewAnimation) override; + void HideMenuNG(bool showPreviewAnimation, bool startDrag) override; void ShowPopup(const RefPtr& newComponent, bool disableTouchEvent = true) override; void ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo) override; void HidePopupNG(int32_t targetId) override; diff --git a/frameworks/base/subwindow/subwindow.h b/frameworks/base/subwindow/subwindow.h index c6c5f7c5fb0..4c593118756 100644 --- a/frameworks/base/subwindow/subwindow.h +++ b/frameworks/base/subwindow/subwindow.h @@ -40,7 +40,7 @@ public: virtual void ShowMenu(const RefPtr& newComponent) = 0; virtual void ShowMenuNG(const RefPtr menuNode, int32_t targetId, const NG::OffsetF& offset) = 0; virtual void HideMenuNG(const RefPtr& menu, int32_t targetId) = 0; - virtual void HideMenuNG(bool showPreviewAnimation = true) = 0; + virtual void HideMenuNG(bool showPreviewAnimation = true, bool startDrag = false) = 0; virtual void ShowPopup(const RefPtr& newComponent, bool disableTouchEvent = true) = 0; virtual void ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo) = 0; virtual void HidePopupNG(int32_t targetId) = 0; diff --git a/frameworks/base/subwindow/subwindow_manager.cpp b/frameworks/base/subwindow/subwindow_manager.cpp index 34b696ee710..393f2d279a5 100644 --- a/frameworks/base/subwindow/subwindow_manager.cpp +++ b/frameworks/base/subwindow/subwindow_manager.cpp @@ -204,11 +204,11 @@ void SubwindowManager::HideMenuNG(const RefPtr& menu, int32_t tar } } -void SubwindowManager::HideMenuNG(bool showPreviewAnimation) +void SubwindowManager::HideMenuNG(bool showPreviewAnimation, bool startDrag) { auto subwindow = GetCurrentWindow(); if (subwindow) { - subwindow->HideMenuNG(showPreviewAnimation); + subwindow->HideMenuNG(showPreviewAnimation, startDrag); } } diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index f743f638042..ce02e81bfa6 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -68,7 +68,7 @@ public: void ShowMenuNG(const RefPtr& menuNode, int32_t targetId, const NG::OffsetF& offset, bool isAboveApps = false); void HideMenuNG(const RefPtr& menu, int32_t targetId); - void HideMenuNG(bool showPreviewAnimation = true); + void HideMenuNG(bool showPreviewAnimation = true, bool startDrag = false); void ShowPopup(const RefPtr& newComponent, bool disableTouchEvent = true); void ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo); void HidePopupNG(int32_t targetId, int32_t instanceId = -1); diff --git a/frameworks/base/test/mock/mock_subwindow_manager.cpp b/frameworks/base/test/mock/mock_subwindow_manager.cpp index 604ba1800ee..6baf2f9c408 100644 --- a/frameworks/base/test/mock/mock_subwindow_manager.cpp +++ b/frameworks/base/test/mock/mock_subwindow_manager.cpp @@ -39,7 +39,7 @@ void SubwindowManager::ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupI void SubwindowManager::HideMenuNG(const RefPtr& menu, int32_t targetId) {} -void SubwindowManager::HideMenuNG(bool showPreviewAnimation) {} +void SubwindowManager::HideMenuNG(bool showPreviewAnimation, bool startDrag) {} void SubwindowManager::SetHotAreas(const std::vector& rects, int32_t overlayId, int32_t instanceId) {} diff --git a/frameworks/core/components_ng/event/drag_event.cpp b/frameworks/core/components_ng/event/drag_event.cpp index 9a922af4bfc..19a6e735f23 100644 --- a/frameworks/core/components_ng/event/drag_event.cpp +++ b/frameworks/core/components_ng/event/drag_event.cpp @@ -154,7 +154,7 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co HideEventColumn(); HidePixelMap(true, info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY()); HideFilter(); - SubwindowManager::GetInstance()->HideMenuNG(false); + SubwindowManager::GetInstance()->HideMenuNG(false, true); AnimationOption option; option.SetDuration(PIXELMAP_ANIMATION_DURATION); option.SetCurve(Curves::SHARP); @@ -175,6 +175,17 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co frameNode->SetDraggable(true); textDragCallback_(info.GetGlobalLocation()); } + } else if (!isNotInPreviewState_ && (gestureHub->GetPreviewMode() != MenuPreviewMode::NONE)) { + HideEventColumn(); + HidePixelMap(true, info.GetGlobalLocation().GetX(), info.GetGlobalLocation().GetY()); + HideFilter(); + SubwindowManager::GetInstance()->HideMenuNG(false, true); + AnimationOption option; + option.SetDuration(PIXELMAP_ANIMATION_DURATION); + option.SetCurve(Curves::SHARP); + AnimationUtils::Animate( + option, [renderContext]() { renderContext->UpdateOpacity(SCALE_NUMBER); }, + option.GetOnFinishEvent()); } } @@ -318,6 +329,11 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co auto actuator = weak.Upgrade(); CHECK_NULL_VOID(actuator); actuator->SetIsNotInPreviewState(true); + auto gestureHub = actuator->gestureEventHub_.Upgrade(); + CHECK_NULL_VOID(gestureHub); + if (gestureHub->GetPreviewMode() != MenuPreviewMode::NONE) { + actuator->SetIsNotInPreviewState(false); + } auto pipeline = PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipeline); auto dragDropManager = pipeline->GetDragDropManager(); diff --git a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp index 8f90c898804..8bbce36fc20 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_layout_algorithm.cpp @@ -1209,6 +1209,12 @@ void MenuLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) } auto menuPosition = MenuLayoutAvoidAlgorithm(menuProp, menuPattern, size, didNeedArrow); SetMenuPlacementForAnimation(layoutWrapper); + arrowPosition_ = GetArrowPositionWithPlacement(size); + if (didNeedArrow && arrowPlacement_ != Placement::NONE) { + LayoutArrow(layoutWrapper); + } + LOGD("Menu layout, offset = %{public}s", menuPosition.ToString().c_str()); + geometryNode->SetFrameOffset(menuPosition); auto pipeline = PipelineBase::GetCurrentContext(); CHECK_NULL_VOID(pipeline); auto menuTheme = pipeline->GetTheme(); @@ -1221,12 +1227,6 @@ void MenuLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper) auto menuEndOffset = menuPosition - (previewOffset_ - previewOriginOffset_) + FixMenuOriginOffset(1.0f, afterAnimationScale); menuPattern->SetEndOffset(menuEndOffset); - arrowPosition_ = GetArrowPositionWithPlacement(size); - if (didNeedArrow && arrowPlacement_ != Placement::NONE) { - LayoutArrow(layoutWrapper); - } - LOGD("Menu layout, offset = %{public}s", menuPosition.ToString().c_str()); - geometryNode->SetFrameOffset(menuPosition); } // translate each option by the height of previous options diff --git a/frameworks/core/components_ng/pattern/menu/menu_theme.h b/frameworks/core/components_ng/pattern/menu/menu_theme.h index a67ed3e47dc..a224b684bb2 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_theme.h +++ b/frameworks/core/components_ng/pattern/menu/menu_theme.h @@ -68,6 +68,7 @@ public: theme->previewBeforeAnimationScale_ = 0.95f; theme->previewAfterAnimationScale_ = 1.1f; theme->menuAnimationScale_ = 0.4f; + theme->menuDragAnimationScale_ = 0.95f; theme->springMotionResponse_ = 0.416f; theme->springMotionDampingFraction_ = 0.73f; theme->contextMenuAppearDuration_ = 250; @@ -76,6 +77,7 @@ public: theme->previewDisappearSpringMotionDampingFraction_ = 0.97f; theme->filterRadius_ = Dimension(100.0f); theme->previewBorderRadius_ = 16.0_vp; + theme->previewMenuScaleNumber_ = 0.95f; } }; @@ -106,6 +108,11 @@ public: return menuAnimationScale_; } + float GetMenuDragAnimationScale() const + { + return menuDragAnimationScale_; + } + float GetSpringMotionResponse() const { return springMotionResponse_; @@ -136,6 +143,11 @@ public: return previewDisappearSpringMotionDampingFraction_; } + float GetPreviewMenuScaleNumber() const + { + return previewMenuScaleNumber_; + } + Dimension GetFilterRadius() const { return filterRadius_; @@ -155,12 +167,14 @@ private: float previewBeforeAnimationScale_ = 1.0f; float previewAfterAnimationScale_ = 1.0f; float menuAnimationScale_ = 1.0f; + float menuDragAnimationScale_ = 1.0f; float springMotionResponse_ = 0.0f; float springMotionDampingFraction_ = 0.0f; int32_t contextMenuAppearDuration_ = 0; int32_t disappearDuration_ = 0; float previewDisappearSpringMotionResponse_ = 0.0f; float previewDisappearSpringMotionDampingFraction_ = 0.0f; + float previewMenuScaleNumber_ = 0.0f; Dimension filterRadius_; Dimension previewBorderRadius_; }; diff --git a/frameworks/core/components_ng/pattern/menu/menu_view.cpp b/frameworks/core/components_ng/pattern/menu/menu_view.cpp index 61a3527598b..8fdd0028c2c 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_view.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_view.cpp @@ -51,7 +51,6 @@ namespace OHOS::Ace::NG { namespace { #ifdef ENABLE_DRAG_FRAMEWORK -constexpr float SCALE_NUMBER = 0.95f; constexpr float PAN_MAX_VELOCITY = 2000.0f; #endif // create menuWrapper and menu node, update menu props @@ -71,9 +70,23 @@ std::pair, RefPtr> CreateMenu(int32_t targetId, con // create previewNode auto previewNode = FrameNode::CreateFrameNode(V2::MENU_PREVIEW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); + CHECK_NULL_RETURN(previewNode, std::make_pair(wrapperNode, menuNode)); previewNode->AddChild(previewCustomNode); previewNode->MountToParent(wrapperNode); previewNode->MarkModifyDone(); +#ifdef ENABLE_DRAG_FRAMEWORK + auto eventHub = previewNode->GetEventHub(); + CHECK_NULL_RETURN(eventHub, std::make_pair(wrapperNode, menuNode)); + auto gestureHub = eventHub->GetGestureEventHub(); + CHECK_NULL_RETURN(gestureHub, std::make_pair(wrapperNode, menuNode)); + gestureHub->SetPreviewMode(MenuPreviewMode::CUSTOM); + gestureHub->InitDragDropEvent(); + auto dragStart = [](const RefPtr& event, const std::string& extraParams) -> DragDropInfo { + DragDropInfo info; + return info; + }; + eventHub->SetOnDragStart(std::move(dragStart)); +#endif } return { wrapperNode, menuNode }; @@ -278,13 +291,25 @@ void SetPixelMap(const RefPtr& target, const RefPtr& menuN gestureHub = hub->GetOrCreateGestureEventHub(); CHECK_NULL_VOID(gestureHub); InitPanEvent(gestureHub, menuNode); + gestureHub->SetPreviewMode(MenuPreviewMode::IMAGE); + auto dragStart = [](const RefPtr& event, const std::string& extraParams) -> DragDropInfo { + DragDropInfo info; + return info; + }; + gestureHub->InitDragDropEvent(); + hub->SetOnDragStart(std::move(dragStart)); + imageNode->SetDraggable(true); auto imageContext = imageNode->GetRenderContext(); CHECK_NULL_VOID(imageContext); imageContext->UpdatePosition(OffsetT(Dimension(offsetX), Dimension(offsetY))); + auto pipeline = PipelineBase::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto menuTheme = pipeline->GetTheme(); + CHECK_NULL_VOID(menuTheme); ClickEffectInfo clickEffectInfo; clickEffectInfo.level = ClickEffectLevel::LIGHT; - clickEffectInfo.scaleNumber = SCALE_NUMBER; + clickEffectInfo.scaleNumber = menuTheme->GetPreviewMenuScaleNumber(); imageContext->UpdateClickEffectLevel(clickEffectInfo); imageNode->MarkModifyDone(); imageNode->MountToParent(menuNode); diff --git a/frameworks/core/components_ng/pattern/menu/preview/menu_preview_pattern.cpp b/frameworks/core/components_ng/pattern/menu/preview/menu_preview_pattern.cpp index 66a24c2f0ca..82746fb5a53 100644 --- a/frameworks/core/components_ng/pattern/menu/preview/menu_preview_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/preview/menu_preview_pattern.cpp @@ -57,6 +57,17 @@ void MenuPreviewPattern::OnModifyDone() auto gestureHub = hub->GetOrCreateGestureEventHub(); CHECK_NULL_VOID(gestureHub); InitPanEvent(gestureHub); + + auto pipeline = PipelineBase::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto menuTheme = pipeline->GetTheme(); + CHECK_NULL_VOID(menuTheme); + auto previewContext = host->GetRenderContext(); + CHECK_NULL_VOID(previewContext); + ClickEffectInfo clickEffectInfo; + clickEffectInfo.level = ClickEffectLevel::LIGHT; + clickEffectInfo.scaleNumber = menuTheme->GetPreviewMenuScaleNumber(); + previewContext->UpdateClickEffectLevel(clickEffectInfo); } bool MenuPreviewPattern::OnDirtyLayoutWrapperSwap(const RefPtr& dirty, const DirtySwapConfig& config) diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index 42073b9420e..7a10bb76fae 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -156,7 +156,8 @@ void ShowPreviewDisappearAnimation(const RefPtr& menuWrapper }); } -void ShowContextMenuDisappearAnimation(AnimationOption& option, const RefPtr& menuWrapperPattern) +void ShowContextMenuDisappearAnimation( + AnimationOption& option, const RefPtr& menuWrapperPattern, bool startDrag = false) { CHECK_NULL_VOID(menuWrapperPattern); auto menuChild = menuWrapperPattern->GetMenu(); @@ -171,6 +172,10 @@ void ShowContextMenuDisappearAnimation(AnimationOption& option, const RefPtrGetTheme(); CHECK_NULL_VOID(menuTheme); + if (startDrag) { + menuRenderContext->UpdateTransformScale( + VectorF(menuTheme->GetMenuDragAnimationScale(), menuTheme->GetMenuDragAnimationScale())); + } auto springMotionResponse = menuTheme->GetPreviewDisappearSpringMotionResponse(); auto springMotionDampingFraction = menuTheme->GetPreviewDisappearSpringMotionDampingFraction(); AnimationOption positionOption; @@ -440,7 +445,7 @@ void OverlayManager::SetShowMenuAnimation(const RefPtr& menu, bool is menuPattern->SetFirstShow(); } -void OverlayManager::PopMenuAnimation(const RefPtr& menu, bool showPreviewAnimation) +void OverlayManager::PopMenuAnimation(const RefPtr& menu, bool showPreviewAnimation, bool startDrag) { ResetLowerNodeFocusable(menu); @@ -493,7 +498,7 @@ void OverlayManager::PopMenuAnimation(const RefPtr& menu, bool showPr } else { ShowPreviewDisappearAnimation(menuWrapperPattern); } - ShowContextMenuDisappearAnimation(option, menuWrapperPattern); + ShowContextMenuDisappearAnimation(option, menuWrapperPattern, startDrag); } else { AnimationUtils::Animate( option, @@ -948,7 +953,7 @@ void OverlayManager::HideMenuInSubWindow(const RefPtr& menu, int32_t PopMenuAnimation(menu); } -void OverlayManager::HideMenuInSubWindow(bool showPreviewAnimation) +void OverlayManager::HideMenuInSubWindow(bool showPreviewAnimation, bool startDrag) { LOGI("OverlayManager::HideMenuInSubWindow from close"); if (menuMap_.empty()) { @@ -958,7 +963,7 @@ void OverlayManager::HideMenuInSubWindow(bool showPreviewAnimation) auto rootNode = rootNodeWeak_.Upgrade(); for (const auto& child : rootNode->GetChildren()) { auto node = DynamicCast(child); - PopMenuAnimation(node, showPreviewAnimation); + PopMenuAnimation(node, showPreviewAnimation, startDrag); } } diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index 4a9e2e65234..9c458cfb78b 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -102,7 +102,7 @@ public: void ShowMenuInSubWindow(int32_t targetId, const NG::OffsetF& offset, RefPtr menu = nullptr); void HideMenuInSubWindow(const RefPtr& menu, int32_t targetId); RefPtr GetMenuNode(int32_t targetId); - void HideMenuInSubWindow(bool showPreviewAnimation = true); + void HideMenuInSubWindow(bool showPreviewAnimation = true, bool startDrag = false); void CleanMenuInSubWindow(); void CleanPreviewInSubWindow(); void CleanMenuInSubWindowWithAnimation(); @@ -307,7 +307,7 @@ private: void OnDialogCloseEvent(const RefPtr& node); void SetShowMenuAnimation(const RefPtr& menu, bool isInSubWindow = false); - void PopMenuAnimation(const RefPtr& menu, bool showPreviewAnimation = true); + void PopMenuAnimation(const RefPtr& menu, bool showPreviewAnimation = true, bool startDrag = false); void OpenDialogAnimation(const RefPtr& node); void CloseDialogAnimation(const RefPtr& node); diff --git a/test/mock/base/mock_subwindow.h b/test/mock/base/mock_subwindow.h index f9c9a93f6d1..ff35867d83f 100644 --- a/test/mock/base/mock_subwindow.h +++ b/test/mock/base/mock_subwindow.h @@ -31,7 +31,7 @@ public: MOCK_METHOD1(ShowMenu, void(const RefPtr& newComponent)); MOCK_METHOD3(ShowMenuNG, void(const RefPtr menuNode, int32_t targetId, const NG::OffsetF& offset)); MOCK_METHOD2(HideMenuNG, void(const RefPtr& menu, int32_t targetId)); - MOCK_METHOD1(HideMenuNG, void(bool showPreviewAnimation)); + MOCK_METHOD2(HideMenuNG, void(bool showPreviewAnimation, bool startDrag)); MOCK_METHOD2(ShowPopup, void(const RefPtr& newComponent, bool disableTouchEvent)); MOCK_METHOD2(ShowPopupNG, void(int32_t targetId, const NG::PopupInfo& popupInfo)); MOCK_METHOD1(HidePopupNG, void(int32_t targetId));