From 8c47e3fabc23899b7952d06f332aa874d90bf511 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E5=87=AF?= Date: Tue, 3 Jun 2025 17:53:11 +0800 Subject: [PATCH] scrolltomasterbug2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘永凯 --- .../pattern/grid/grid_pattern.cpp | 1 + .../pattern/list/list_pattern.cpp | 1 + .../pattern/scroll/scroll_pattern.cpp | 1 + .../pattern/scrollable/scrollable.cpp | 9 +++++++-- .../pattern/scrollable/scrollable_pattern.h | 12 +++++++++--- .../pattern/waterflow/water_flow_pattern.cpp | 1 + .../pattern/scrollable/scrollable_test_ng.cpp | 18 ++++++++++++++++++ 7 files changed, 38 insertions(+), 5 deletions(-) diff --git a/frameworks/core/components_ng/pattern/grid/grid_pattern.cpp b/frameworks/core/components_ng/pattern/grid/grid_pattern.cpp index 487ea319988..d0afef090ee 100644 --- a/frameworks/core/components_ng/pattern/grid/grid_pattern.cpp +++ b/frameworks/core/components_ng/pattern/grid/grid_pattern.cpp @@ -555,6 +555,7 @@ bool GridPattern::OnDirtyLayoutWrapperSwap(const RefPtr& dirty, c CheckScrollable(); MarkSelectedItems(); isInitialized_ = true; + ChangeCanStayOverScroll(true); auto paintProperty = GetPaintProperty(); CHECK_NULL_RETURN(paintProperty, false); return paintProperty->GetFadingEdge().value_or(false) || paintProperty->HasContentClip(); diff --git a/frameworks/core/components_ng/pattern/list/list_pattern.cpp b/frameworks/core/components_ng/pattern/list/list_pattern.cpp index ede27660d3e..ef1e2562ae3 100644 --- a/frameworks/core/components_ng/pattern/list/list_pattern.cpp +++ b/frameworks/core/components_ng/pattern/list/list_pattern.cpp @@ -300,6 +300,7 @@ bool ListPattern::OnDirtyLayoutWrapperSwap(const RefPtr& dirty, c MarkSelectedItems(); UpdateListDirectionInCardStyle(); snapTrigByScrollBar_ = false; + ChangeCanStayOverScroll(true); return true; } diff --git a/frameworks/core/components_ng/pattern/scroll/scroll_pattern.cpp b/frameworks/core/components_ng/pattern/scroll/scroll_pattern.cpp index 4503bdd6c83..7b470733572 100644 --- a/frameworks/core/components_ng/pattern/scroll/scroll_pattern.cpp +++ b/frameworks/core/components_ng/pattern/scroll/scroll_pattern.cpp @@ -144,6 +144,7 @@ bool ScrollPattern::OnDirtyLayoutWrapperSwap(const RefPtr& dirty, if (scrollEdgeType_ != ScrollEdgeType::SCROLL_NONE && AnimateStoped()) { scrollEdgeType_ = ScrollEdgeType::SCROLL_NONE; } + ChangeCanStayOverScroll(); return paintProperty->GetFadingEdge().value_or(false); } diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp b/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp index e4ef3238cb9..5b56d1b7c04 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable.cpp @@ -628,7 +628,7 @@ void Scrollable::HandleDragStart(const OHOS::Ace::GestureEvent& info) "IsAxisAnimationRunning:%u, IsSnapAnimationRunning:%u, id:%d, tag:%s", info.GetInputEventType(), info.GetSourceTool(), isAxisEvent, IsAxisAnimationRunning(), IsSnapAnimationRunning(), nodeId_, nodeTag_.c_str()); - if (isAxisEvent) { + if (isAxisEvent && !CanStayOverScroll()) { if (!IsAxisAnimationRunning() && !IsSnapAnimationRunning()) { axisSnapDistance_ = currentPos_; snapDirection_ = SnapDirection::NONE; @@ -702,7 +702,7 @@ void Scrollable::HandleDragUpdate(const GestureEvent& info) #endif ACE_SCOPED_TRACE( "HandleDragUpdate, mainDelta:%f, source:%d, id:%d, tag:%s", mainDelta, source, nodeId_, nodeTag_.c_str()); - if (isAxisEvent) { + if (isAxisEvent && !CanStayOverScroll()) { ProcessAxisUpdateEvent(mainDelta); return; } @@ -863,6 +863,11 @@ void Scrollable::ProcessAxisEndEvent() isTouching_ = false; isDragUpdateStop_ = false; JankFrameReport::GetInstance().ClearFrameJankFlag(JANK_RUNNING_SCROLL); + if (CanStayOverScroll()) { + StopScrollable(); + HandleOverScroll(0); + SetCanStayOverScroll(false); + } } void Scrollable::ReportToDragFRCScene(double velocity, NG::SceneStatus sceneStatus) diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h index 64e17ae49cb..97bbbfb3b0c 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h @@ -410,9 +410,9 @@ public: bool useTotalOffset = true); virtual bool CanOverScroll(int32_t source) { - auto canOverScroll = - (IsScrollableSpringEffect() && source != SCROLL_FROM_AXIS && source != SCROLL_FROM_BAR && IsScrollable() && - (!ScrollableIdle() || animateOverScroll_ || animateCanOverScroll_)); + auto canOverScroll = (IsScrollableSpringEffect() && (source != SCROLL_FROM_AXIS || GetCanStayOverScroll()) && + source != SCROLL_FROM_BAR && IsScrollable() && + (!ScrollableIdle() || animateOverScroll_ || animateCanOverScroll_)); if (canOverScroll != lastCanOverScroll_) { lastCanOverScroll_ = canOverScroll; AddScrollableFrameInfo(source); @@ -435,6 +435,12 @@ public: { return canStayOverScroll_; } + void ChangeCanStayOverScroll(bool useCurrentDelta = true) + { + if (!IsOutOfBoundary(useCurrentDelta)) { + SetIsOverScroll(false); + } + } void MarkSelectedItems(); bool ShouldSelectScrollBeStopped(); void UpdateMouseStart(float offset); diff --git a/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.cpp b/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.cpp index f44ab582c6d..d5ea0663df3 100644 --- a/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.cpp +++ b/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.cpp @@ -363,6 +363,7 @@ bool WaterFlowPattern::OnDirtyLayoutWrapperSwap(const RefPtr& dir } layoutInfo_->isDataValid_ = true; + ChangeCanStayOverScroll(); return NeedRender(); } diff --git a/test/unittest/core/pattern/scrollable/scrollable_test_ng.cpp b/test/unittest/core/pattern/scrollable/scrollable_test_ng.cpp index a6df6358da6..98395904d83 100644 --- a/test/unittest/core/pattern/scrollable/scrollable_test_ng.cpp +++ b/test/unittest/core/pattern/scrollable/scrollable_test_ng.cpp @@ -1608,6 +1608,24 @@ HWTEST_F(ScrollableTestNg, onScrollerAreaChangeEventTest001, TestSize.Level1) EXPECT_EQ(isChange, true); } +/** + * @tc.name: ChangeCanStayOverScroll + * @tc.desc: Test ChangeCanStayOverScroll + * @tc.type: FUNC + */ +HWTEST_F(ScrollableTestNg, ChangeCanStayOverScroll, TestSize.Level1) +{ + /** + * @tc.steps: step1. Initialize ScrollablePattern type pointer and set EdgeEffect to Spring. + * @tc.expected: spring animation is running. + */ + auto pattern = scroll_->GetPattern(); + ASSERT_NE(pattern, nullptr); + pattern->SetCanStayOverScroll(true); + pattern->ChangeCanStayOverScroll(); + EXPECT_TRUE(pattern->GetCanStayOverScroll()); +} + #ifdef SUPPORT_DIGITAL_CROWN /** * @tc.name: ListenDigitalCrownEvent001 -- Gitee