diff --git a/frameworks/core/components_ng/base/view_abstract_model_ng.cpp b/frameworks/core/components_ng/base/view_abstract_model_ng.cpp index c9a38d9208862928d7a7983402768c8978492091..01d2a645ac7bd2fbd0e0e8ee8b584588cab2dab8 100644 --- a/frameworks/core/components_ng/base/view_abstract_model_ng.cpp +++ b/frameworks/core/components_ng/base/view_abstract_model_ng.cpp @@ -147,6 +147,13 @@ void ViewAbstractModelNG::BindContextMenu(ResponseType type, std::functionGetDragDropManager(); + CHECK_NULL_VOID(dragDropManager); + if (dragDropManager->IsAboutToPreview() || dragDropManager->IsDragging()) { + return; + } if (menuParam.previewMode == MenuPreviewMode::IMAGE) { auto context = targetNode->GetRenderContext(); CHECK_NULL_VOID(context); @@ -157,8 +164,6 @@ void ViewAbstractModelNG::BindContextMenu(ResponseType type, std::functionGetDisplayWindowRectInfo(); menuPosition += NG::OffsetF { windowRect.Left(), windowRect.Top() }; CreateCustomMenu(builder, targetNode, menuPosition, previewBuildFunc, menuParam); diff --git a/frameworks/core/components_ng/event/drag_event.cpp b/frameworks/core/components_ng/event/drag_event.cpp index f6836dc1a9b76ce88dd56fef8a5fecbeb58dbada..9a922af4bfcba1d4fb63ce1f2290f45c23cbd02a 100644 --- a/frameworks/core/components_ng/event/drag_event.cpp +++ b/frameworks/core/components_ng/event/drag_event.cpp @@ -80,7 +80,7 @@ DragEventActuator::DragEventActuator( panRecognizer_ = MakeRefPtr(fingers_, direction_, distance_); longPressRecognizer_ = AceType::MakeRefPtr(LONG_PRESS_DURATION, fingers_, false, false); previewLongPressRecognizer_ = - AceType::MakeRefPtr(PREVIEW_LONG_PRESS_RECONGNIZER, fingers_, false, true); + AceType::MakeRefPtr(PREVIEW_LONG_PRESS_RECONGNIZER, fingers_, false, false); isNotInPreviewState_ = false; } @@ -131,6 +131,11 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co } auto actuator = weak.Upgrade(); CHECK_NULL_VOID(actuator); + auto pipeline = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto dragDropManager = pipeline->GetDragDropManager(); + CHECK_NULL_VOID(dragDropManager); + dragDropManager->ResetDragging(DragDropMgrState::ABOUT_TO_PREVIEW); #ifdef ENABLE_DRAG_FRAMEWORK auto gestureHub = actuator->gestureEventHub_.Upgrade(); CHECK_NULL_VOID(gestureHub); @@ -306,10 +311,6 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co result.emplace_back(SequencedRecognizer_); return; } - auto menuLongPress = gestureHub->GetLongPressRecognizer(); - if (menuLongPress) { - menuLongPress->SetIsForDrag(true); - } auto longPressUpdateValue = [weak = WeakClaim(this)](GestureEvent& info) { if (SystemProperties::GetDebugEnabled()) { LOGI("DragEvent longPressRecognizer onActionUpdate."); @@ -317,12 +318,24 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co auto actuator = weak.Upgrade(); CHECK_NULL_VOID(actuator); actuator->SetIsNotInPreviewState(true); + auto pipeline = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto dragDropManager = pipeline->GetDragDropManager(); + CHECK_NULL_VOID(dragDropManager); + dragDropManager->ResetDragging(); }; longPressRecognizer_->SetOnActionUpdate(longPressUpdateValue); auto longPressUpdate = [weak = WeakClaim(this)](GestureEvent& info) { if (SystemProperties::GetDebugEnabled()) { LOGI("DragEvent previewLongPressRecognizer onActionUpdate."); } + auto pipeline = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + auto dragDropManager = pipeline->GetDragDropManager(); + CHECK_NULL_VOID(dragDropManager); + if (dragDropManager->IsAboutToPreview() || dragDropManager->IsDragging()) { + return; + } auto actuator = weak.Upgrade(); CHECK_NULL_VOID(actuator); auto gestureHub = actuator->gestureEventHub_.Upgrade(); @@ -343,8 +356,6 @@ void DragEventActuator::OnCollectTouchTarget(const OffsetF& coordinateOffset, co } actuator->SetFilter(actuator); - auto pipeline = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(pipeline); auto manager = pipeline->GetOverlayManager(); CHECK_NULL_VOID(manager); actuator->SetIsNotInPreviewState(false); diff --git a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp index 4d7a04d74041831a8fedf3df12eb6476161313f4..fc8a1fa6c4dda00f630644f91eeb052d89517a57 100644 --- a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp @@ -177,11 +177,7 @@ void LongPressRecognizer::HandleTouchMoveEvent(const TouchEvent& event) return; } Offset offset = event.GetOffset() - touchPoints_[event.id].GetOffset(); - auto longPressThreshold = MAX_THRESHOLD; - if (isForDrag_) { - longPressThreshold = DRAG_LONG_PRESS_THRESHOLD; - } - if (offset.GetDistance() > longPressThreshold) { + if (offset.GetDistance() > MAX_THRESHOLD) { LOGD("this gesture is not long press, try to reject it"); Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; diff --git a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.h b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.h index 0006a95be307ede5555e8ae07d2f88793630f540..2335a80165a8f8d54460d7c83f0cc742a4dcecec 100644 --- a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.h +++ b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.h @@ -89,11 +89,6 @@ public: onAccessibilityEventFunc_ = std::move(onAccessibilityEvent); } - void SetIsForDrag(bool isForDrag) - { - isForDrag_ = isForDrag; - } - GestureEventFunc GetLongPressActionFunc(); private: diff --git a/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h b/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h index 356bc05dfb5b855a57f892e2d3b229604fbc9c1b..d02b93d980bfe198b7582d04baf29ea79b57ae05 100644 --- a/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h +++ b/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h @@ -29,6 +29,7 @@ namespace OHOS::Ace::NG { enum class DragDropMgrState : int32_t { IDLE, + ABOUT_TO_PREVIEW, DRAGGING }; @@ -161,6 +162,11 @@ public: return dragDropState_ == DragDropMgrState::DRAGGING; } + bool IsAboutToPreview() + { + return dragDropState_ == DragDropMgrState::ABOUT_TO_PREVIEW; + } + void ResetDragging(DragDropMgrState dragDropMgrState = DragDropMgrState::IDLE) { dragDropState_ = dragDropMgrState; diff --git a/frameworks/core/gestures/gesture_info.h b/frameworks/core/gestures/gesture_info.h index c5c35d5feca03f709e003be273a442e29023593d..cd93eb4990ef785cb13b963185f059803736f6fb 100644 --- a/frameworks/core/gestures/gesture_info.h +++ b/frameworks/core/gestures/gesture_info.h @@ -43,7 +43,6 @@ namespace OHOS::Ace { constexpr int32_t DEFAULT_PAN_FINGER = 1; constexpr Dimension DEFAULT_PAN_DISTANCE = 5.0_vp; -constexpr double DRAG_LONG_PRESS_THRESHOLD = 3.0; constexpr Dimension DRAG_PAN_DISTANCE_MOUSE = 1.0_vp; constexpr Dimension DEFAULT_SLIDE_DISTANCE = DEFAULT_PAN_DISTANCE; constexpr int32_t DEFAULT_SLIDE_FINGER = DEFAULT_PAN_FINGER;