From be44244ebafc216e666eeae4b5009831435ecec7 Mon Sep 17 00:00:00 2001 From: caocan Date: Mon, 7 Nov 2022 15:55:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8D=A1=E7=89=87=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E9=95=BF=E6=8C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: caocan Change-Id: Ic58dcda1ae7653722b6280c66e26b78b13d7f8e8 --- frameworks/core/common/event_manager.cpp | 9 +++++++++ .../components_ng/gestures/gesture_referee.cpp | 14 ++++++++++++++ .../core/components_ng/gestures/gesture_referee.h | 8 ++++++++ .../core/components_ng/pattern/form/form_node.cpp | 2 +- frameworks/core/gestures/gesture_referee.cpp | 13 +++++++++++++ frameworks/core/gestures/gesture_referee.h | 15 +++++++++++++++ 6 files changed, 60 insertions(+), 1 deletion(-) diff --git a/frameworks/core/common/event_manager.cpp b/frameworks/core/common/event_manager.cpp index cdbadf5445f..bb61ff1bb77 100644 --- a/frameworks/core/common/event_manager.cpp +++ b/frameworks/core/common/event_manager.cpp @@ -616,6 +616,15 @@ EventManager::EventManager() LOGD("EventManger Constructor."); refereeNG_ = AceType::MakeRefPtr(); referee_ = AceType::MakeRefPtr(); + + auto callback = [weak = WeakClaim(this)](size_t touchId) -> bool { + auto eventManager = weak.Upgrade(); + CHECK_NULL_RETURN(eventManager, false); + auto refereeNG = eventManager->refereeNG_; + CHECK_NULL_RETURN(refereeNG, false); + return refereeNG->HasGestureAccepted(touchId); + }; + referee_->SetQueryStateFunc(std::move(callback)); } } // namespace OHOS::Ace diff --git a/frameworks/core/components_ng/gestures/gesture_referee.cpp b/frameworks/core/components_ng/gestures/gesture_referee.cpp index 1b8c3d4cd52..823e3f3cfe3 100644 --- a/frameworks/core/components_ng/gestures/gesture_referee.cpp +++ b/frameworks/core/components_ng/gestures/gesture_referee.cpp @@ -69,6 +69,7 @@ bool GestureScope::CheckNeedBlocked(const RefPtr& recognize void GestureScope::OnAcceptGesture(const RefPtr& recognizer) { + hasGestureAccepted_ = true; for (const auto& weak : recognizers_) { auto gesture = weak.Upgrade(); if (gesture == recognizer) { @@ -272,4 +273,17 @@ void GestureReferee::HandleRejectDisposal(const RefPtr& rec } } +bool GestureReferee::HasGestureAccepted(size_t touchId) const +{ + const auto& iter = gestureScopes_.find(touchId); + if (iter == gestureScopes_.end()) { + LOGI("gesture scope is not exist"); + return false; + } + + const auto& scope = iter->second; + CHECK_NULL_RETURN(scope, false); + return scope->HasGestureAccepted(); +} + } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/gestures/gesture_referee.h b/frameworks/core/components_ng/gestures/gesture_referee.h index 11480d4f2a0..e0b815546b5 100644 --- a/frameworks/core/components_ng/gestures/gesture_referee.h +++ b/frameworks/core/components_ng/gestures/gesture_referee.h @@ -71,12 +71,18 @@ public: isDelay_ = true; } + bool HasGestureAccepted() const + { + return hasGestureAccepted_; + } + private: bool Existed(const RefPtr& recognizer); std::list> recognizers_; size_t touchId_ = 0; bool isDelay_ = false; + bool hasGestureAccepted_ = false; }; class GestureReferee : public virtual AceType { @@ -95,6 +101,8 @@ public: // or reject) void Adjudicate(const RefPtr& recognizer, GestureDisposal disposal); + bool HasGestureAccepted(size_t touchId) const; + private: void HandleAcceptDisposal(const RefPtr& recognizer); void HandlePendingDisposal(const RefPtr& recognizer); diff --git a/frameworks/core/components_ng/pattern/form/form_node.cpp b/frameworks/core/components_ng/pattern/form/form_node.cpp index 9a5128424ab..264a0145020 100644 --- a/frameworks/core/components_ng/pattern/form/form_node.cpp +++ b/frameworks/core/components_ng/pattern/form/form_node.cpp @@ -45,7 +45,7 @@ HitTestResult FormNode::TouchTest(const PointF& globalPoint, const PointF& paren context->SetTouchPipeline(WeakPtr(subContext)); } - return HitTestResult::STOP_BUBBLING; + return HitTestResult::BUBBLING; } RefPtr FormNode::GetOrCreateFormNode( diff --git a/frameworks/core/gestures/gesture_referee.cpp b/frameworks/core/gestures/gesture_referee.cpp index eea5d133a28..286776c73b4 100644 --- a/frameworks/core/gestures/gesture_referee.cpp +++ b/frameworks/core/gestures/gesture_referee.cpp @@ -120,6 +120,12 @@ void GestureScope::HandleParallelDisposal(const RefPtr& recog void GestureScope::HandleAcceptDisposal(const RefPtr& recognizer) { + if (queryStateFunc_ && queryStateFunc_(touchId_)) { + LOGI("gesture has accepted in NG."); + recognizer->SetRefereeState(RefereeState::FAIL); + return; + } + if (CheckNeedBlocked(recognizer)) { LOGI("gesture referee ready to notify block for %{public}s", AceType::TypeName(recognizer)); recognizer->SetRefereeState(RefereeState::BLOCKED); @@ -132,6 +138,12 @@ void GestureScope::HandleAcceptDisposal(const RefPtr& recogni void GestureScope::HandlePendingDisposal(const RefPtr& recognizer) { + if (queryStateFunc_ && queryStateFunc_(touchId_)) { + LOGI("gesture has accepted in NG."); + recognizer->SetRefereeState(RefereeState::FAIL); + return; + } + if (CheckNeedBlocked(recognizer)) { LOGI("gesture referee ready to notify block for %{public}s", AceType::TypeName(recognizer)); recognizer->SetRefereeState(RefereeState::BLOCKED); @@ -368,6 +380,7 @@ void GestureReferee::AddGestureRecognizer(size_t touchId, const RefPtr #include #include @@ -52,6 +53,11 @@ public: bool IsPending() const; + void SetQueryStateFunc(const std::function& queryStateFunc) + { + queryStateFunc_ = queryStateFunc; + } + private: bool Existed(const RefPtr& recognizer); const std::list>& GetMembersByRecognizer(const RefPtr& recognizer); @@ -69,6 +75,8 @@ private: std::list> highRecognizers_; std::list> lowRecognizers_; std::list> parallelRecognizers_; + + std::function queryStateFunc_; }; class GestureReferee : public virtual AceType { @@ -93,9 +101,16 @@ public: // or reject) void Adjudicate(size_t touchId, const RefPtr& recognizer, GestureDisposal disposal); + void SetQueryStateFunc(std::function&& queryStateFunc) + { + queryStateFunc_ = queryStateFunc; + } + private: // Stores gesture recognizer collection according to Id. std::unordered_map gestureScopes_; + + std::function queryStateFunc_; }; } // namespace OHOS::Ace -- Gitee