From 43c70232cccbdf9f0aa1ebddb27dcedf4c5608c9 Mon Sep 17 00:00:00 2001 From: hongzexuan Date: Thu, 29 May 2025 21:42:20 +0800 Subject: [PATCH] fix scrollbar Signed-off-by: hongzexuan Change-Id: I34f035b68eda825e50f35c7d73b20411d313441c --- .../pattern/scroll/inner/scroll_bar.cpp | 31 ++++++++++++------- .../pattern/scroll/inner/scroll_bar.h | 16 ++++++++++ .../pattern/scroll_bar/scroll_bar_pattern.cpp | 2 ++ .../pattern/scrollable/scrollable_pattern.cpp | 1 + 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.cpp b/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.cpp index 05108d8ab37..9bfae0e7d36 100644 --- a/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.cpp +++ b/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.cpp @@ -17,7 +17,6 @@ #include "base/log/dump_log.h" #include "core/common/vibrator/vibrator_utils.h" -#include "core/pipeline_ng/pipeline_context.h" namespace OHOS::Ace::NG { namespace { @@ -45,7 +44,7 @@ ScrollBar::ScrollBar(DisplayMode displayMode, ShapeMode shapeMode, PositionMode void ScrollBar::InitTheme() { - auto pipelineContext = PipelineContext::GetCurrentContextSafelyWithCheck(); + auto pipelineContext = GetContext(); CHECK_NULL_VOID(pipelineContext); auto theme = pipelineContext->GetTheme(); CHECK_NULL_VOID(theme); @@ -202,9 +201,8 @@ void ScrollBar::UpdateActiveRectOffset(double activeMainOffset) void ScrollBar::SetBarRegion(const Offset& offset, const Size& size) { if (shapeMode_ == ShapeMode::RECT) { - double mainSize = (positionMode_ == PositionMode::BOTTOM ? size.Width() : size.Height()); - auto scrollBarMarginStart = scrollBarMargin_.value_or(ScrollBarMargin()).start_.ConvertToPxWithSize(mainSize); - auto scrollBarMarginEnd = scrollBarMargin_.value_or(ScrollBarMargin()).end_.ConvertToPxWithSize(mainSize); + auto scrollBarMarginStart = NormalizeToPxWithPercent(scrollBarMargin_.value_or(ScrollBarMargin()).start_); + auto scrollBarMarginEnd = NormalizeToPxWithPercent(scrollBarMargin_.value_or(ScrollBarMargin()).end_); double reserved = NormalizeToPx(startReservedHeight_) + NormalizeToPx(endReservedHeight_) + scrollBarMarginStart + scrollBarMarginEnd; double height = std::max(size.Height() - reserved, 0.0); @@ -227,8 +225,8 @@ void ScrollBar::SetRectTrickRegion( const Offset& offset, const Size& size, const Offset& lastOffset, double estimatedHeight, int32_t scrollSource) { double mainSize = (positionMode_ == PositionMode::BOTTOM ? size.Width() : size.Height()); - auto scrollBarMarginStart = scrollBarMargin_.value_or(ScrollBarMargin()).start_.ConvertToPxWithSize(mainSize); - auto scrollBarMarginEnd = scrollBarMargin_.value_or(ScrollBarMargin()).end_.ConvertToPxWithSize(mainSize); + auto scrollBarMarginStart = NormalizeToPxWithPercent(scrollBarMargin_.value_or(ScrollBarMargin()).start_); + auto scrollBarMarginEnd = NormalizeToPxWithPercent(scrollBarMargin_.value_or(ScrollBarMargin()).end_); barRegionSize_ = std::max(mainSize - NormalizeToPx(endReservedHeight_) - NormalizeToPx(startReservedHeight_) - scrollBarMarginStart - scrollBarMarginEnd, 0.0); if (LessOrEqual(estimatedHeight, 0.0)) { @@ -386,11 +384,20 @@ float ScrollBar::CalcPatternOffset(float scrollBarOffset) const double ScrollBar::NormalizeToPx(const Dimension& dimension) const { - auto pipelineContext = PipelineContext::GetCurrentContextSafelyWithCheck(); + auto pipelineContext = GetContext(); CHECK_NULL_RETURN(pipelineContext, 0.0); return pipelineContext->NormalizeToPx(dimension); } +double ScrollBar::NormalizeToPxWithPercent(const Dimension& dimension) const +{ + if (dimension.Unit() == DimensionUnit::PERCENT) { + auto mainSize = (positionMode_ == PositionMode::BOTTOM ? viewPortSize_.Width() : viewPortSize_.Height()); + return dimension.Value() * mainSize; + } + return NormalizeToPx(dimension); +} + void ScrollBar::SetGestureEvent() { if (!touchEvent_) { @@ -499,7 +506,7 @@ void ScrollBar::SetHoverEvent() void ScrollBar::CalcReservedHeight() { - auto pipelineContext = PipelineContext::GetCurrentContextSafelyWithCheck(); + auto pipelineContext = GetContext(); CHECK_NULL_VOID(pipelineContext); if (Container::LessThanAPIVersion(PlatformVersion::VERSION_TEN)) { auto theme = pipelineContext->GetTheme(); @@ -689,7 +696,7 @@ void ScrollBar::HandleDragEnd(const GestureEvent& info) } if (!frictionController_) { - auto context = PipelineContext::GetCurrentContextSafelyWithCheck(); + auto context = GetContext(); CHECK_NULL_VOID(context); frictionController_ = CREATE_ANIMATOR(context); frictionController_->AddStopListener([weakBar = AceType::WeakClaim(this)]() { @@ -753,7 +760,7 @@ void ScrollBar::ScheduleDisappearDelayTask() { if (displayMode_ == DisplayMode::AUTO && isScrollable_ && !isHover_) { disappearDelayTask_.Cancel(); - auto context = PipelineContext::GetCurrentContextSafelyWithCheck(); + auto context = GetContext(); CHECK_NULL_VOID(context); auto taskExecutor = context->GetTaskExecutor(); CHECK_NULL_VOID(taskExecutor); @@ -830,7 +837,7 @@ bool ScrollBar::AnalysisUpOrDown(Point point, bool& reverse) void ScrollBar::ScheduleCaretLongPress() { - auto context = PipelineContext::GetCurrentContextSafelyWithCheck(); + auto context = GetContext(); CHECK_NULL_VOID(context); if (!context->GetTaskExecutor()) { return; diff --git a/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.h b/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.h index 681c2b1df60..6f5d14d7d3e 100644 --- a/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.h +++ b/frameworks/core/components_ng/pattern/scroll/inner/scroll_bar.h @@ -35,6 +35,7 @@ #include "core/components_ng/pattern/scrollable/scrollable_properties.h" #include "core/components_ng/property/border_property.h" #include "core/components_ng/gestures/recognizers/long_press_recognizer.h" +#include "core/pipeline_ng/pipeline_context.h" namespace OHOS::Ace::NG { @@ -437,12 +438,26 @@ public: return IsPressed() ? arcForegroundColor_.BlendColor(PRESSED_BLEND_COLOR) : arcForegroundColor_; } + void SetHost(const RefPtr& host) + { + scrollableNode_ = host; + } + + RefPtr GetContext() const + { + if (scrollableNode_) { + return scrollableNode_->GetContextRefPtr(); + } + return PipelineContext::GetCurrentContextSafelyWithCheck(); + } + protected: void InitTheme(); virtual void SetBarRegion(const Offset& offset, const Size& size); virtual void SetRoundTrickRegion(const Offset& offset, const Size& size, const Offset& lastOffset, double mainScrollExtent); double NormalizeToPx(const Dimension& dimension) const; + double NormalizeToPxWithPercent(const Dimension& dimension) const; Dimension GetNormalWidth() { return normalWidth_; @@ -716,6 +731,7 @@ private: RefPtr clickevent_; RefPtr longPressRecognizer_; Offset locationInfo_; + RefPtr scrollableNode_; // dump info std::list innerScrollBarLayoutInfos_; bool needAddLayoutInfo = false; diff --git a/frameworks/core/components_ng/pattern/scroll_bar/scroll_bar_pattern.cpp b/frameworks/core/components_ng/pattern/scroll_bar/scroll_bar_pattern.cpp index 3a3bc8df312..0441780aa1a 100644 --- a/frameworks/core/components_ng/pattern/scroll_bar/scroll_bar_pattern.cpp +++ b/frameworks/core/components_ng/pattern/scroll_bar/scroll_bar_pattern.cpp @@ -238,6 +238,8 @@ void ScrollBarPattern::SetScrollBar(DisplayMode displayMode) DisplayMode oldDisplayMode = DisplayMode::OFF; if (!scrollBar_) { scrollBar_ = CreateScrollBar(); + CHECK_NULL_VOID(scrollBar_); + scrollBar_->SetHost(host); RegisterScrollBarEventTask(); host->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); } else { diff --git a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp index af21dd82a48..211edeb8045 100644 --- a/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp +++ b/frameworks/core/components_ng/pattern/scrollable/scrollable_pattern.cpp @@ -1110,6 +1110,7 @@ void ScrollablePattern::SetScrollBar(DisplayMode displayMode) if (!scrollBar_) { scrollBar_ = CreateScrollBar(); CHECK_NULL_VOID(scrollBar_); + scrollBar_->SetHost(host); RegisterScrollBarEventTask(); } else { oldDisplayMode = scrollBar_->GetDisplayMode(); -- Gitee