From 103448729645d09bd3452783a7819f8d27e454d1 Mon Sep 17 00:00:00 2001 From: Zhang-Dong-hui Date: Mon, 30 Jun 2025 21:51:58 +0800 Subject: [PATCH] GestureJudgeResult should be continue when isHitTestBlock is true Signed-off-by: Zhang-Dong-hui Change-Id: I673871f182046da90b34bc98b04cf36777f73240 --- .../components_ng/event/scrollable_event.cpp | 10 ++++--- .../core/event/scrollable_event_test_ng.cpp | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/frameworks/core/components_ng/event/scrollable_event.cpp b/frameworks/core/components_ng/event/scrollable_event.cpp index ca8a3467bda..5380c0fe13f 100644 --- a/frameworks/core/components_ng/event/scrollable_event.cpp +++ b/frameworks/core/components_ng/event/scrollable_event.cpp @@ -130,7 +130,7 @@ void ScrollableActuator::CollectTouchTarget(const OffsetF& coordinateOffset, con if (event->GetEnabled() || clickJudge) { InitClickRecognizer(coordinateOffset, getEventTargetImpl, frameNode, targetComponent, event, clickJudge, localPoint, touchRestrict.sourceType); - result.emplace_back(clickRecognizer_); + result.emplace_front(clickRecognizer_); responseLinkResult.emplace_back(clickRecognizer_); } break; @@ -145,6 +145,7 @@ void ScrollableActuator::InitClickRecognizer(const OffsetF& coordinateOffset, if (!clickRecognizer_) { clickRecognizer_ = MakeRefPtr(); } + bool isHitTestBlock = event->IsHitTestBlock(localPoint, source); clickRecognizer_->SetCoordinateOffset(Offset(coordinateOffset.GetX(), coordinateOffset.GetY())); clickRecognizer_->SetGetEventTargetImpl(getEventTargetImpl); clickRecognizer_->SetNodeId(frameNode->GetId()); @@ -152,10 +153,11 @@ void ScrollableActuator::InitClickRecognizer(const OffsetF& coordinateOffset, clickRecognizer_->SetTargetComponent(targetComponent); clickRecognizer_->SetIsSystemGesture(true); clickRecognizer_->SetRecognizerType(GestureTypeName::TAP_GESTURE); - clickRecognizer_->SetSysGestureJudge([clickJudge](const RefPtr& gestureInfo, + clickRecognizer_->SetSysGestureJudge([isHitTestBlock, clickJudge](const RefPtr& gestureInfo, const std::shared_ptr&) -> GestureJudgeResult { - TAG_LOGI(AceLogTag::ACE_SCROLLABLE, "Scrollable GestureJudge: clickJudge %{public}d", clickJudge); - return clickJudge ? GestureJudgeResult::CONTINUE : GestureJudgeResult::REJECT; + TAG_LOGI( + AceLogTag::ACE_SCROLLABLE, "Scrollable GestureJudge:%{public}d, %{public}d", isHitTestBlock, clickJudge); + return isHitTestBlock || clickJudge ? GestureJudgeResult::CONTINUE : GestureJudgeResult::REJECT; }); clickRecognizer_->SetOnClick([weak = WeakClaim(RawPtr(frameNode))](const ClickInfo&) { auto frameNode = weak.Upgrade(); diff --git a/test/unittest/core/event/scrollable_event_test_ng.cpp b/test/unittest/core/event/scrollable_event_test_ng.cpp index 893d3e509f7..3d54ddbdb8c 100755 --- a/test/unittest/core/event/scrollable_event_test_ng.cpp +++ b/test/unittest/core/event/scrollable_event_test_ng.cpp @@ -364,4 +364,34 @@ HWTEST_F(ScrollableEventTestNg, ScrollableEventOnCollectTouchTargetTest006, Test result, LOCAL_POINT, frameNode, nullptr, responseLinkResult); EXPECT_FALSE(results); } + +/** + * @tc.name: ScrollableEventOnCollectTouchTargetTest007 + * @tc.desc: Create ScrollableEvent and test CollectTouchTarget + * @tc.type: FUNC + */ +HWTEST_F(ScrollableEventTestNg, ScrollableEventOnCollectTouchTargetTest007, TestSize.Level1) +{ + auto eventHub = AceType::MakeRefPtr(); + auto gestureEventHub = AceType::MakeRefPtr(AceType::WeakClaim(AceType::RawPtr(eventHub))); + auto scrollableActuator = + AceType::MakeRefPtr((AceType::WeakClaim(AceType::RawPtr(gestureEventHub)))); + auto scrollableEvent = AceType::MakeRefPtr(SCROLLABLE_EVENT_AXIS); + auto scrollable = AceType::MakeRefPtr(); + scrollableEvent->SetScrollable(scrollable); + scrollableActuator->AddScrollableEvent(scrollableEvent); + auto frameNode = AceType::MakeRefPtr(V2::TEXT_ETS_TAG, -1, AceType::MakeRefPtr()); + TouchTestResult result; + ResponseLinkResult responseLinkResult; + scrollableActuator->CollectTouchTarget(COORDINATE_OFFSET, SCROLL_RESTRICT, eventHub->CreateGetEventTargetImpl(), + result, LOCAL_POINT, frameNode, nullptr, responseLinkResult); + RefPtr targetComponent = AceType::MakeRefPtr(); + scrollableActuator->clickRecognizer_->targetComponent_ = targetComponent; + EXPECT_EQ(scrollableActuator->clickRecognizer_->TriggerGestureJudgeCallback(), GestureJudgeResult::REJECT); + scrollable->isTouching_ = true; + scrollable->currentVelocity_ = HTMBLOCK_VELOCITY + 1.0f; + scrollableActuator->CollectTouchTarget(COORDINATE_OFFSET, SCROLL_RESTRICT, eventHub->CreateGetEventTargetImpl(), + result, LOCAL_POINT, frameNode, nullptr, responseLinkResult); + EXPECT_EQ(scrollableActuator->clickRecognizer_->TriggerGestureJudgeCallback(), GestureJudgeResult::CONTINUE); +} } // namespace OHOS::Ace::NG -- Gitee