From af878e7a21814bf6a384d25cc03b7b078e2c936e Mon Sep 17 00:00:00 2001 From: huqingyun Date: Sun, 27 Jul 2025 18:45:08 +0800 Subject: [PATCH] =?UTF-8?q?onVisibleAreaChange:=20=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E6=94=AF=E6=8C=81scale=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huqingyun --- .../jsview/js_view_abstract.cpp | 14 ++++++- .../models/view_abstract_model_impl.cpp | 2 +- .../jsview/models/view_abstract_model_impl.h | 4 +- .../core/components_ng/base/frame_node.cpp | 13 +++++- .../core/components_ng/base/view_abstract.cpp | 6 ++- .../core/components_ng/base/view_abstract.h | 2 +- .../components_ng/base/view_abstract_model.h | 4 +- .../base/view_abstract_model_ng.h | 4 +- .../event/visible_ratio_callback.h | 4 ++ .../core/base/frame_node_test_ng_v3.cpp | 40 +++++++++++++++++++ 10 files changed, 80 insertions(+), 13 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp index 687f4bc3935..6cb451088ed 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp @@ -11328,7 +11328,7 @@ void JSViewAbstract::JsClickEffect(const JSCallbackInfo& info) void JSViewAbstract::JsOnVisibleAreaChange(const JSCallbackInfo& info) { - if (info.Length() != 2) { + if (info.Length() < 2 || info.Length() > 3) { return; } @@ -11366,7 +11366,17 @@ void JSViewAbstract::JsOnVisibleAreaChange(const JSCallbackInfo& info) PipelineContext::SetCallBackNode(node); func->ExecuteJS(2, params); }; - ViewAbstractModel::GetInstance()->SetOnVisibleChange(std::move(onVisibleChange), ratioVec); + + bool enhance = false; + if (info.Length() == 3 && info[2]->IsObject()) { + const auto& options = info[2]; + JSRef optionObj = JSRef::Cast(options); + JSRef enhanceVal = optionObj->GetProperty("allowBeyondBoundary"); + if (enhanceVal->IsBoolean()) { + enhance = enhanceVal->ToBoolean(); + } + } + ViewAbstractModel::GetInstance()->SetOnVisibleChange(std::move(onVisibleChange), ratioVec, enhance); } void JSViewAbstract::JsOnVisibleAreaApproximateChange(const JSCallbackInfo& info) diff --git a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp index 657f4faf0ae..72d81c6a398 100755 --- a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.cpp @@ -1252,7 +1252,7 @@ void ViewAbstractModelImpl::SetOnDrop(NG::OnDragDropFunc&& onDrop) } void ViewAbstractModelImpl::SetOnVisibleChange( - std::function&& onVisibleChange, const std::vector& ratios) + std::function&& onVisibleChange, const std::vector& ratios, bool enhance) { auto inspector = ViewStackProcessor::GetInstance()->GetInspectorComposedComponent(); CHECK_NULL_VOID(inspector); diff --git a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h index 78f7d1634e5..48e3ed537f4 100644 --- a/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h +++ b/frameworks/bridge/declarative_frontend/jsview/models/view_abstract_model_impl.h @@ -242,8 +242,8 @@ public: void SetOnDragLeave(NG::OnDragDropFunc&& onDragLeave) override; void SetOnDragMove(NG::OnDragDropFunc&& onDragMove) override; void SetOnDrop(NG::OnDragDropFunc&& onDrop) override; - void SetOnVisibleChange( - std::function&& onVisibleChange, const std::vector& ratios) override; + void SetOnVisibleChange(std::function&& onVisibleChange, const std::vector& ratios, + bool enhance = false) override; void SetOnVisibleAreaApproximateChange(const std::function&& onVisibleChange, const std::vector& ratioList, int32_t expectedUpdateInterval) override {}; void SetOnAreaChanged( diff --git a/frameworks/core/components_ng/base/frame_node.cpp b/frameworks/core/components_ng/base/frame_node.cpp index 445956baee4..5fc230ac1d4 100755 --- a/frameworks/core/components_ng/base/frame_node.cpp +++ b/frameworks/core/components_ng/base/frame_node.cpp @@ -2003,8 +2003,13 @@ void FrameNode::TriggerVisibleAreaChangeCallback( } } if (hasUserCallback) { - ProcessVisibleAreaChangeEvent( - visibleResult.visibleRect, visibleResult.frameRect, visibleAreaUserRatios, visibleAreaUserCallback, true); + if (visibleAreaUserCallback.option.enhance) { + ProcessVisibleAreaChangeEvent(visibleResult.innerVisibleRect, visibleResult.innerFrameRect, + visibleAreaUserRatios, visibleAreaUserCallback, true); + } else { + ProcessVisibleAreaChangeEvent(visibleResult.visibleRect, visibleResult.frameRect, visibleAreaUserRatios, + visibleAreaUserCallback, true); + } } } @@ -2021,6 +2026,10 @@ void FrameNode::ProcessVisibleAreaChangeEvent(const RectF& visibleRect, const Re NearEqual(currentVisibleRatio, lastVisibleRatio_) ? "non-execution" : "execution"); } if (isUser) { + if (visibleAreaCallback.option.enhance) { + auto rect = renderContext_->GetPaintRectWithoutTransform(); + currentVisibleRatio = rect.IsEmpty() ? VISIBLE_RATIO_MIN : currentVisibleRatio; + } if (!NearEqual(currentVisibleRatio, lastVisibleRatio_)) { auto lastVisibleCallbackRatio = lastVisibleCallbackRatio_; ProcessAllVisibleCallback( diff --git a/frameworks/core/components_ng/base/view_abstract.cpp b/frameworks/core/components_ng/base/view_abstract.cpp index 33c0a11812e..960c6f4ea38 100644 --- a/frameworks/core/components_ng/base/view_abstract.cpp +++ b/frameworks/core/components_ng/base/view_abstract.cpp @@ -2734,7 +2734,7 @@ void ViewAbstract::SetOnSizeChanged(std::function &&onVisibleChange, - const std::vector &ratioList) + const std::vector &ratioList, bool enhance) { auto pipeline = PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(pipeline); @@ -2742,6 +2742,10 @@ void ViewAbstract::SetOnVisibleChange(std::function &&onVisi CHECK_NULL_VOID(frameNode); frameNode->CleanVisibleAreaUserCallback(); pipeline->AddVisibleAreaChangeNode(frameNode, ratioList, onVisibleChange); + auto eventHub = frameNode->GetEventHub(); + CHECK_NULL_VOID(eventHub); + auto& visibleAreaUserCallback = eventHub->GetVisibleAreaCallback(true); + visibleAreaUserCallback.option = { enhance }; } void ViewAbstract::SetResponseRegion(const std::vector& responseRegion) diff --git a/frameworks/core/components_ng/base/view_abstract.h b/frameworks/core/components_ng/base/view_abstract.h index f2552c443d2..d5ab3beb4a6 100644 --- a/frameworks/core/components_ng/base/view_abstract.h +++ b/frameworks/core/components_ng/base/view_abstract.h @@ -422,7 +422,7 @@ public: static void SetOnAreaChanged(std::function &&onAreaChanged); static void SetOnVisibleChange(std::function &&onVisibleChange, - const std::vector &ratioList); + const std::vector &ratioList, bool enhance = false); static void SetOnSizeChanged(std::function &&onSizeChanged); static void SetResponseRegion(const std::vector &responseRegion); static void SetMouseResponseRegion(const std::vector &mouseResponseRegion); diff --git a/frameworks/core/components_ng/base/view_abstract_model.h b/frameworks/core/components_ng/base/view_abstract_model.h index 203e128765d..d1e3c0a545e 100644 --- a/frameworks/core/components_ng/base/view_abstract_model.h +++ b/frameworks/core/components_ng/base/view_abstract_model.h @@ -364,8 +364,8 @@ public: virtual void SetAllowDrop(const std::set& allowDrop) = 0; virtual void SetDrawModifier(const RefPtr& drawModifier) = 0; virtual void SetDragPreview(const NG::DragDropInfo& info) = 0; - virtual void SetOnVisibleChange( - std::function&& onVisibleChange, const std::vector& ratios) = 0; + virtual void SetOnVisibleChange(std::function&& onVisibleChange, + const std::vector& ratios, bool enhance = false) = 0; virtual void SetOnVisibleAreaApproximateChange(const std::function&& onVisibleChange, const std::vector& ratioList, int32_t expectedUpdateInterval) = 0; virtual void SetOnAreaChanged( diff --git a/frameworks/core/components_ng/base/view_abstract_model_ng.h b/frameworks/core/components_ng/base/view_abstract_model_ng.h index 73423db36e8..ff95fc0d5d9 100644 --- a/frameworks/core/components_ng/base/view_abstract_model_ng.h +++ b/frameworks/core/components_ng/base/view_abstract_model_ng.h @@ -1353,9 +1353,9 @@ public: } void SetOnVisibleChange( - std::function&& onVisibleChange, const std::vector& ratios) override + std::function&& onVisibleChange, const std::vector& ratios, bool enhance) override { - ViewAbstract::SetOnVisibleChange(std::move(onVisibleChange), ratios); + ViewAbstract::SetOnVisibleChange(std::move(onVisibleChange), ratios, enhance); } void SetOnVisibleAreaApproximateChange(const std::function&& onVisibleChange, diff --git a/frameworks/core/components_ng/event/visible_ratio_callback.h b/frameworks/core/components_ng/event/visible_ratio_callback.h index 5fdabfe0043..a0e9bd1bc82 100644 --- a/frameworks/core/components_ng/event/visible_ratio_callback.h +++ b/frameworks/core/components_ng/event/visible_ratio_callback.h @@ -22,11 +22,15 @@ namespace OHOS::Ace { using VisibleRatioCallback = std::function; +struct VisibleAreaOption { + bool enhance = false; +}; struct VisibleCallbackInfo { VisibleRatioCallback callback; double visibleRatio = 1.0; bool isCurrentVisible = false; uint32_t period = 0; + VisibleAreaOption option; }; } // namespace OHOS::Ace diff --git a/test/unittest/core/base/frame_node_test_ng_v3.cpp b/test/unittest/core/base/frame_node_test_ng_v3.cpp index a8874cede96..12cb712777a 100644 --- a/test/unittest/core/base/frame_node_test_ng_v3.cpp +++ b/test/unittest/core/base/frame_node_test_ng_v3.cpp @@ -474,4 +474,44 @@ HWTEST_F(FrameNodeTestNg, GetGlobalPositionOnDisplay001, TestSize.Level1) frameNode->AddChild(child); EXPECT_TRUE(frameNode->GetCurrentPageRootNode() != nullptr); } + +/** + * @tc.name: TriggerVisibleAreaChangeCallback100 + * @tc.desc: Test TriggerVisibleAreaChangeCallback. + * @tc.type: FUNC + */ +HWTEST_F(FrameNodeTestNg, TriggerVisibleAreaChangeCallback100, TestSize.Level1) +{ + /** + * @tc.steps: step1. initialize parameters. + */ + auto frameNode = FrameNode::CreateFrameNode("page", 1, AceType::MakeRefPtr(), true); + auto child = FrameNode::CreateFrameNode("column", 3, AceType::MakeRefPtr(), false); + frameNode->SetActive(true); + child->SetActive(true); + frameNode->AddChild(child); + auto context = PipelineContext::GetCurrentContext(); + ASSERT_NE(context, nullptr); + context->onShow_ = true; + frameNode->AttachContext(AceType::RawPtr(context)); + child->AttachContext(AceType::RawPtr(context)); + + RectF rect = RectF(0, 0, 100, 100); + child->renderContext_->UpdatePaintRect(rect); + frameNode->renderContext_->UpdatePaintRect(rect); + auto eventHub = child->GetOrCreateEventHub(); + ASSERT_NE(eventHub, nullptr); + auto onVisibleChange = [](bool visible, double ratio) {}; + std::vector ratioList = { 0.0, 1.0 }; + VisibleCallbackInfo addInfo; + addInfo.callback = std::move(onVisibleChange); + addInfo.isCurrentVisible = false; + child->SetVisibleAreaUserCallback(ratioList, addInfo); + auto& visibleAreaUserCallback = eventHub->GetVisibleAreaCallback(true); + child->TriggerVisibleAreaChangeCallback(1, false); + EXPECT_FALSE(visibleAreaUserCallback.option.enhance); + visibleAreaUserCallback.option = { true }; + child->TriggerVisibleAreaChangeCallback(2, false); + EXPECT_TRUE(visibleAreaUserCallback.option.enhance); +} } // namespace OHOS::Ace::NG \ No newline at end of file -- Gitee