diff --git a/frameworks/core/components_ng/pattern/grid/grid_pattern.h b/frameworks/core/components_ng/pattern/grid/grid_pattern.h index 8d65760b37b0756448dcbae64b4624fef4cfe6b7..04ac0a243d3f8b2c7ac802e85cea60cfb66b855d 100644 --- a/frameworks/core/components_ng/pattern/grid/grid_pattern.h +++ b/frameworks/core/components_ng/pattern/grid/grid_pattern.h @@ -174,7 +174,7 @@ public: bool UpdateStartIndex(int32_t index, ScrollAlign align); - float GetTotalOffset() const override + double GetTotalOffset() const override { return EstimateHeight(); } diff --git a/frameworks/core/components_ng/pattern/list/list_pattern.cpp b/frameworks/core/components_ng/pattern/list/list_pattern.cpp index 51e0abc14795062cc126a04f18aa28e06f43309d..7233f01838cc99f36283437273ad3518424c18ed 100644 --- a/frameworks/core/components_ng/pattern/list/list_pattern.cpp +++ b/frameworks/core/components_ng/pattern/list/list_pattern.cpp @@ -881,7 +881,7 @@ void ListPattern::GetListItemGroupEdge(bool& groupAtStart, bool& groupAtEnd) con float ListPattern::GetOffsetWithLimit(float offset) const { - auto currentOffset = GetTotalOffset() + contentStartOffset_; + float currentOffset = GetTotalOffset() + contentStartOffset_; if (Positive(offset)) { return std::min(currentOffset, offset); } else if (Negative(offset)) { @@ -2272,7 +2272,7 @@ float ListPattern::UpdateTotalOffset(const RefPtr& listLayo return 0; } float relativeOffset = listLayoutAlgorithm->GetCurrentOffset(); - float prevOffset = currentOffset_; + double prevOffset = currentOffset_; if (childrenSize_) { listTotalHeight_ = posMap_->GetTotalHeight(); currentOffset_ = itemPosition_.empty() ? 0.0f : diff --git a/frameworks/core/components_ng/pattern/list/list_pattern.h b/frameworks/core/components_ng/pattern/list/list_pattern.h index 7b34e07675b3c29d9479d90bd496b2e1bf5c4135..138f4d66d111d946a740fb21bf6e9326be1d03db 100644 --- a/frameworks/core/components_ng/pattern/list/list_pattern.h +++ b/frameworks/core/components_ng/pattern/list/list_pattern.h @@ -180,7 +180,7 @@ public: return itemPosition_; } - float GetTotalOffset() const override + double GetTotalOffset() const override { return currentOffset_; } @@ -634,7 +634,7 @@ private: std::optional focusGroupIndex_; float prevStartOffset_ = 0.f; float prevEndOffset_ = 0.f; - float currentOffset_ = 0.0f; + double currentOffset_ = 0.0f; bool maintainVisibleContentPosition_ = false; std::optional lastSnapTargetIndex_; diff --git a/frameworks/core/components_ng/pattern/list/list_position_map.cpp b/frameworks/core/components_ng/pattern/list/list_position_map.cpp index 7a8c18f5d986fb621c6a87c657903f0f44ceb3b1..1c33e342be8cd18065ac7b2cc642a71a4d64c1e3 100644 --- a/frameworks/core/components_ng/pattern/list/list_position_map.cpp +++ b/frameworks/core/components_ng/pattern/list/list_position_map.cpp @@ -54,7 +54,7 @@ ListPosMapUpdate ListPositionMap::CheckPosMapUpdateRule() return flag; } -void ListPositionMap::UpdatePosMapStart(float delta, float& listCurrentPos, float space, +void ListPositionMap::UpdatePosMapStart(float delta, double& listCurrentPos, float space, int32_t startIndex, float startPos, bool groupAtStart) { auto it = posMap_.find(startIndex); diff --git a/frameworks/core/components_ng/pattern/list/list_position_map.h b/frameworks/core/components_ng/pattern/list/list_position_map.h index 3bce1a323c305499a3a6ff44850e87e2a776073b..4043bbf82d8b6e8627358900e9076572f2b3b687 100644 --- a/frameworks/core/components_ng/pattern/list/list_position_map.h +++ b/frameworks/core/components_ng/pattern/list/list_position_map.h @@ -93,7 +93,7 @@ public: ListPosMapUpdate CheckPosMapUpdateRule(); - void UpdatePosMapStart(float delta, float& listCurrentPos, float space, + void UpdatePosMapStart(float delta, double& listCurrentPos, float space, int32_t startIndex, float startPos, bool groupAtStart); void UpdatePosMapEnd(int32_t prevEndIndex, float space, bool groupAtEnd); diff --git a/frameworks/core/components_ng/pattern/scroll/scroll_pattern.h b/frameworks/core/components_ng/pattern/scroll/scroll_pattern.h index 6e14fbafe5fffcce186ac81b3925f3b1c05457af..151d22bde8e6176ad17a0d962abd629e408123f8 100644 --- a/frameworks/core/components_ng/pattern/scroll/scroll_pattern.h +++ b/frameworks/core/components_ng/pattern/scroll/scroll_pattern.h @@ -105,7 +105,7 @@ public: return currentOffset_; } - float GetTotalOffset() const override + double GetTotalOffset() const override { return -currentOffset_; } diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp index 1123e566a6c5bb13eaefebed23932d7d8c842c22..20902f481b36cb17005499043ddc78202e1803bb 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp @@ -2118,13 +2118,13 @@ float ScrollablePattern::GetOutOfScrollableOffset() const float ScrollablePattern::GetOffsetWithLimit(float offset) const { if (Positive(offset)) { - auto totalOffset = GetTotalOffset(); + float totalOffset = GetTotalOffset(); return std::min(totalOffset, offset); } else if (Negative(offset)) { auto frameNode = GetHost(); CHECK_NULL_RETURN(frameNode, true); auto hostSize = frameNode->GetGeometryNode()->GetFrameSize(); - auto remainHeight = GetTotalHeight() - GetTotalOffset() - hostSize.MainSize(axis_); + float remainHeight = GetTotalHeight() - GetTotalOffset() - hostSize.MainSize(axis_); return std::max(offset, -remainHeight); } return 0; diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h index c22ab8d0042dab90787a30ed8d016fd16f2bdc8c..bf686a893f37cd3d7d95eb48d4d14044c6b2829c 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.h @@ -390,7 +390,7 @@ public: void PlaySpringAnimation( float position, float velocity, float mass, float stiffness, float damping, bool useTotalOffset = true); void PlayCurveAnimation(float position, float duration, const RefPtr& curve, bool canOverScroll); - virtual float GetTotalOffset() const + virtual double GetTotalOffset() const { return 0.0f; } diff --git a/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.h b/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.h index 329b0c49f07c657b003abad54c698e5fc9353f10..4071e519a12115253737788b33cbe4de9e7c0d26 100644 --- a/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.h +++ b/frameworks/core/components_ng/pattern/waterflow/water_flow_pattern.h @@ -106,7 +106,7 @@ public: int32_t GetChildrenCount() const; - float GetTotalOffset() const override + double GetTotalOffset() const override { return -layoutInfo_->Offset(); } diff --git a/test/unittest/core/pattern/list/list_common_test_ng.cpp b/test/unittest/core/pattern/list/list_common_test_ng.cpp index ba6473ba10308df3810107e2ed542d9dec2b4239..c7643e1cb75b89bbbd0bd2ef695c7322bcf7a94f 100644 --- a/test/unittest/core/pattern/list/list_common_test_ng.cpp +++ b/test/unittest/core/pattern/list/list_common_test_ng.cpp @@ -17,6 +17,7 @@ #include "test/mock/core/animation/mock_animation_manager.h" #include "test/mock/core/common/mock_container.h" #include "test/mock/core/pipeline/mock_pipeline_context.h" +#include "ui/base/geometry/dimension.h" #include "core/components/common/properties/shadow_config.h" #include "core/components/list/list_theme.h" @@ -2851,6 +2852,36 @@ HWTEST_F(ListCommonTestNg, GetCurrentOffset001, TestSize.Level1) EXPECT_TRUE(IsEqual(pattern_->GetCurrentOffset(), Offset(ITEM_MAIN_SIZE, 0.0))); } +/** + * @tc.name: GetTotalOffset001 + * @tc.desc: Test GetTotalOffset + * @tc.type: FUNC + */ +HWTEST_F(ListCommonTestNg, GetTotalOffset001, TestSize.Level1) +{ + constexpr double contentMainSize = 1000000000.0; + constexpr double itemMainSize = 50000000.0; + constexpr int32_t totalItemCount = contentMainSize / itemMainSize; + + CreateList(); + CreateItemWithSize(totalItemCount, SizeT(FILL_LENGTH, Dimension(itemMainSize))); + CreateDone(); + + ScrollToIndex(totalItemCount - 1, false, ScrollAlign::AUTO); + + double prevOffset = pattern_->GetTotalOffset(); + float delta = 1.0f; + UpdateCurrentOffset(delta); + double currentOffset = pattern_->GetTotalOffset(); + EXPECT_TRUE(IsEqual(currentOffset, prevOffset - delta)); + + prevOffset = pattern_->GetTotalOffset(); + delta = -1.0f; + UpdateCurrentOffset(delta); + currentOffset = pattern_->GetTotalOffset(); + EXPECT_TRUE(IsEqual(currentOffset, prevOffset - delta)); +} + /** * @tc.name: OnAnimateStop001 * @tc.desc: Test OnAnimateStop diff --git a/test/unittest/core/pattern/test_ng.h b/test/unittest/core/pattern/test_ng.h index beea912dd038fac2265c8579ff64906895578696..0fc1f22a7aaad3575fe9475fbaf809131814389c 100644 --- a/test/unittest/core/pattern/test_ng.h +++ b/test/unittest/core/pattern/test_ng.h @@ -71,6 +71,22 @@ public: } return AssertionFailure() << "Actual: " << actual << " Expected: " << expected; } + + AssertionResult IsEqual(const float& actual, const double& expected) + { + if (NearEqual(actual, expected)) { + return AssertionSuccess(); + } + return AssertionFailure() << "Actual: " << actual << " Expected: " << expected; + } + + AssertionResult IsEqual(const double& actual, const float& expected) + { + if (NearEqual(actual, expected)) { + return AssertionSuccess(); + } + return AssertionFailure() << "Actual: " << actual << " Expected: " << expected; + } AssertionResult IsEqual(const float& actual, const float& expected) { diff --git a/test/unittest/core/pattern/web/web_pattern_focus_test_ng.cpp b/test/unittest/core/pattern/web/web_pattern_focus_test_ng.cpp index f257c9bcac9a3f4bbb8e9f082fee7824867b886a..74316f1b27a564faabcb4ff8f830b8fe30db853e 100755 --- a/test/unittest/core/pattern/web/web_pattern_focus_test_ng.cpp +++ b/test/unittest/core/pattern/web/web_pattern_focus_test_ng.cpp @@ -265,7 +265,7 @@ public: void StopAnimate() override {} - float GetTotalOffset() const override + double GetTotalOffset() const override { return 0.0f; } diff --git a/test/unittest/core/pattern/web/web_select_overlay_test.cpp b/test/unittest/core/pattern/web/web_select_overlay_test.cpp index 292122c41e3f393b302f94b5c2cccb413cd3be21..b93173c72072c769aac89bbaaba9dc29398f19d1 100644 --- a/test/unittest/core/pattern/web/web_select_overlay_test.cpp +++ b/test/unittest/core/pattern/web/web_select_overlay_test.cpp @@ -994,7 +994,7 @@ public: void StopAnimate() override {} - float GetTotalOffset() const override + double GetTotalOffset() const override { return 0.0f; }