diff --git a/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.cpp b/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.cpp index 028c85f0ccc59450db7718101ad913b5b5ca4e98..cc683dc8928b557b7f962c71ed000e7e5aaf417e 100644 --- a/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.cpp +++ b/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.cpp @@ -2881,6 +2881,11 @@ void SheetPresentationPattern::OnScrollEndRecursive(const std::optional& sheetObject_->OnScrollEndRecursive(velocity); } +void SheetPresentationPattern::OnScrollDragEndRecursive() +{ + sheetObject_->OnScrollDragEndRecursive(); +} + bool SheetPresentationPattern::HandleScrollVelocity(float velocity, const RefPtr& child) { return sheetObject_->HandleScrollVelocity(velocity); diff --git a/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.h b/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.h index a362aab2eee1494d59e6b9a805a9b1164cd90fa3..a060aced75f160ca6f44edd7d6a03b57a1bf5052 100644 --- a/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.h +++ b/frameworks/core/components_ng/pattern/overlay/sheet_presentation_pattern.h @@ -945,6 +945,7 @@ public: void OnScrollStartRecursive( WeakPtr child, float position, float dragVelocity = 0.0f) override; void OnScrollEndRecursive (const std::optional& velocity) override; + void OnScrollDragEndRecursive() override; bool HandleScrollVelocity(float velocity, const RefPtr& child = nullptr) override; ScrollResult HandleScrollWithSheet(float scrollOffset); Shadow GetShadowFromTheme(ShadowStyle shadowStyle); diff --git a/frameworks/core/components_ng/pattern/sheet/content_cover/sheet_content_cover_object.h b/frameworks/core/components_ng/pattern/sheet/content_cover/sheet_content_cover_object.h index 562307c3a4ec77eb4922bba7459b355efbdb7b14..fad07a2df1010ad759b3b95503c4ecd79d2bdbad 100644 --- a/frameworks/core/components_ng/pattern/sheet/content_cover/sheet_content_cover_object.h +++ b/frameworks/core/components_ng/pattern/sheet/content_cover/sheet_content_cover_object.h @@ -47,6 +47,7 @@ public: } void OnScrollStartRecursive(float position, float dragVelocity = 0.0f) override {}; void OnScrollEndRecursive(const std::optional& velocity) override {}; + void OnScrollDragEndRecursive() override {}; bool HandleScrollVelocity(float velocity) override { return false; diff --git a/frameworks/core/components_ng/pattern/sheet/sheet_object.cpp b/frameworks/core/components_ng/pattern/sheet/sheet_object.cpp index ac063a7e8bf4749995f350414564dcb9b10d47af..c8f45e5be96e8ddd4ccfd42fed9588add6480bea 100644 --- a/frameworks/core/components_ng/pattern/sheet/sheet_object.cpp +++ b/frameworks/core/components_ng/pattern/sheet/sheet_object.cpp @@ -446,8 +446,7 @@ ScrollResult SheetObject::HandleScroll(float scrollOffset, int32_t source, Neste if (scrollState == ScrollState::SCROLL) { return HandleScrollWithSheet(scrollOffset); } - HandleDragEnd(scrollOffset > 0 ? SHEET_VELOCITY_THRESHOLD : -SHEET_VELOCITY_THRESHOLD); - isSheetPosChanged_ = false; + dragVelocity_ = scrollOffset > 0 ? SHEET_VELOCITY_THRESHOLD : -SHEET_VELOCITY_THRESHOLD; } else if (state == NestedState::CHILD_OVER_SCROLL) { isSheetNeedScroll_ = false; return {scrollOffset, true}; @@ -521,6 +520,14 @@ void SheetObject::OnScrollEndRecursive(const std::optional& velocity) } } +void SheetObject::OnScrollDragEndRecursive() +{ + if (isSheetPosChanged_) { + HandleDragEnd(dragVelocity_); + isSheetPosChanged_ = false; + } +} + bool SheetObject::HandleScrollVelocity(float velocity) { if (isSheetPosChanged_) { diff --git a/frameworks/core/components_ng/pattern/sheet/sheet_object.h b/frameworks/core/components_ng/pattern/sheet/sheet_object.h index ff5dd3dd6d95cfdc7bf4a467a9a89d5f466db8a5..110c48413c222559a4e3b529ad0a0a80855b4a63 100644 --- a/frameworks/core/components_ng/pattern/sheet/sheet_object.h +++ b/frameworks/core/components_ng/pattern/sheet/sheet_object.h @@ -62,6 +62,7 @@ public: NestedState state, float velocity = 0.f); virtual void OnScrollStartRecursive(float position, float dragVelocity = 0.0f); virtual void OnScrollEndRecursive (const std::optional& velocity); + virtual void OnScrollDragEndRecursive(); virtual bool HandleScrollVelocity(float velocity); virtual void InitScrollProps(); ScrollResult HandleScrollWithSheet(float scrollOffset); @@ -148,6 +149,7 @@ protected: // not need copy. Data that is not unique to the side style bool isSheetNeedScroll_ = false; // true if Sheet is ready to receive scroll offset. bool isSheetPosChanged_ = false; // UpdateTransformTranslate end + float dragVelocity_ = 0.0f; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/sheet/side/sheet_side_object.h b/frameworks/core/components_ng/pattern/sheet/side/sheet_side_object.h index cff6abf8244291ceadc1dbf0492c86e07e305450..5fbf44cc290f8ca15eab6b0b77770eeef5737eae 100644 --- a/frameworks/core/components_ng/pattern/sheet/side/sheet_side_object.h +++ b/frameworks/core/components_ng/pattern/sheet/side/sheet_side_object.h @@ -54,6 +54,7 @@ public: } void OnScrollStartRecursive(float position, float dragVelocity = 0.0f) override {}; void OnScrollEndRecursive(const std::optional& velocity) override {}; + void OnScrollDragEndRecursive() override {}; bool HandleScrollVelocity(float velocity) override { return false; diff --git a/test/unittest/core/pattern/overlay/sheet_presentation_test_ng.cpp b/test/unittest/core/pattern/overlay/sheet_presentation_test_ng.cpp index 4c0c3d556b369a0f2ef1499284aefd94c414c280..a235f7887b809f807bd0522e11748a6c6976d3aa 100644 --- a/test/unittest/core/pattern/overlay/sheet_presentation_test_ng.cpp +++ b/test/unittest/core/pattern/overlay/sheet_presentation_test_ng.cpp @@ -811,6 +811,33 @@ HWTEST_F(SheetPresentationTestNg, OnScrollEndRecursive001, TestSize.Level1) SheetPresentationTestNg::TearDownTestCase(); } +/** + * @tc.name: OnScrollDragEndRecursive001 + * @tc.desc: Increase the coverage of SheetPresentationPattern::OnScrollDragEndRecursive function. + * @tc.type: FUNC + */ +HWTEST_F(SheetPresentationTestNg, OnScrollDragEndRecursive001, TestSize.Level1) +{ + SheetPresentationTestNg::SetUpTestCase(); + auto callback = [](const std::string&) {}; + auto sheetNode = FrameNode::CreateFrameNode("Sheet", 301, + AceType::MakeRefPtr(401, "SheetPresentation", std::move(callback))); + auto sheetPattern = sheetNode->GetPattern(); + ASSERT_NE(sheetPattern, nullptr); + sheetPattern->UpdateSheetType(); + sheetPattern->InitSheetObject(); + auto sheetObject = sheetPattern->GetSheetObject(); + ASSERT_NE(sheetObject, nullptr); + sheetObject->isSheetPosChanged_ = false; + sheetPattern->OnScrollDragEndRecursive(); + EXPECT_FALSE(sheetObject->isSheetPosChanged_); + + sheetObject->isSheetPosChanged_ = true; + sheetPattern->OnScrollDragEndRecursive(); + EXPECT_FALSE(sheetObject->isSheetPosChanged_); + SheetPresentationTestNg::TearDownTestCase(); +} + /** * @tc.name: HandleScrollVelocity001 * @tc.desc: Increase the coverage of SheetPresentationPattern::HandleScrollVelocity function.