From e65cc54048657223f6a979978c3af385feb92b59 Mon Sep 17 00:00:00 2001 From: sichaojiang <16008368+sichaojiang@user.noreply.gitee.com> Date: Fri, 25 Jul 2025 18:33:33 +0800 Subject: [PATCH] =?UTF-8?q?list=E7=BB=84=E4=BB=B6=E6=BB=9A=E5=8A=A8?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=E9=87=8Ffloat=E6=94=B9=E6=88=90double?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E9=AB=98=E4=B8=8A=E6=8A=A5=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E8=80=85=E7=9A=84=E5=81=8F=E7=A7=BB=E9=87=8F=E7=B2=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Id2c1bca354f446f7971768327c4138060666582a Signed-off-by: sichaojiang <565405659@qq.com> --- .../components_ng/pattern/grid/grid_pattern.h | 2 +- .../pattern/list/list_pattern.cpp | 4 +-- .../components_ng/pattern/list/list_pattern.h | 4 +-- .../pattern/list/list_position_map.cpp | 2 +- .../pattern/list/list_position_map.h | 2 +- .../pattern/scroll/scroll_pattern.h | 2 +- .../pattern/scrollable/scrollable_pattern.cpp | 4 +-- .../pattern/scrollable/scrollable_pattern.h | 2 +- .../pattern/waterflow/water_flow_pattern.h | 2 +- .../core/pattern/list/list_common_test_ng.cpp | 31 +++++++++++++++++++ test/unittest/core/pattern/test_ng.h | 16 ++++++++++ .../pattern/web/web_pattern_focus_test_ng.cpp | 2 +- .../pattern/web/web_select_overlay_test.cpp | 2 +- 13 files changed, 61 insertions(+), 14 deletions(-) diff --git a/frameworks/core/components_ng/pattern/grid/grid_pattern.h b/frameworks/core/components_ng/pattern/grid/grid_pattern.h index 8d65760b37b..04ac0a243d3 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 51e0abc1479..7233f01838c 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 7b34e07675b..138f4d66d11 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 7a8c18f5d98..1c33e342be8 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 3bce1a323c3..4043bbf82d8 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 6e14fbafe5f..151d22bde8e 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 1123e566a6c..20902f481b3 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 c22ab8d0042..bf686a893f3 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 329b0c49f07..4071e519a12 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 ba6473ba103..c7643e1cb75 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 beea912dd03..0fc1f22a7aa 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 f257c9bcac9..74316f1b27a 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 292122c41e3..b93173c7207 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; } -- Gitee