From d90bb62a6229af44ded48f501d98936620c34cc7 Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Mon, 19 May 2025 15:30:29 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=8B=E5=8A=BF?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E8=8E=B7=E5=8F=96=E8=A3=B8=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?action=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangweiyuan --- .../gestures/base_gesture_event.h | 37 ++++++++++++ .../gestures/recognizers/click_recognizer.cpp | 3 + .../recognizers/long_press_recognizer.cpp | 5 ++ .../gestures/recognizers/pan_recognizer.cpp | 6 ++ .../gestures/recognizers/pinch_recognizer.cpp | 6 ++ .../recognizers/rotation_recognizer.cpp | 6 ++ .../gestures/recognizers/swipe_recognizer.cpp | 3 + .../native/node/node_gesture_modifier.cpp | 60 +++++++++++++------ 8 files changed, 109 insertions(+), 17 deletions(-) diff --git a/frameworks/core/components_ng/gestures/base_gesture_event.h b/frameworks/core/components_ng/gestures/base_gesture_event.h index 902c8f7714c..40b3fee2979 100644 --- a/frameworks/core/components_ng/gestures/base_gesture_event.h +++ b/frameworks/core/components_ng/gestures/base_gesture_event.h @@ -17,6 +17,10 @@ #include "core/gestures/gesture_info.h" +namespace OHOS::MMI { +class PointerEvent; +} // namespace OHOS::MMI + namespace OHOS::Ace { class ACE_EXPORT BaseGestureEvent : public BaseEventInfo { @@ -36,8 +40,41 @@ public: fingerList_ = fingerList; } + InputEventType GetRawInputEventType() const + { + return rawInputEventType_; + } + + void SetRawInputEventType(InputEventType type) + { + rawInputEventType_ = type; + } + + std::shared_ptr GetRawInputEvent() const + { + return rawInputEvent_; + } + + void SetRawInputEvent(std::shared_ptr rawInputEvent) + { + rawInputEvent_ = rawInputEvent; + } + + int64_t GetRawInputDeviceId() const + { + return rawInputDeviceId_; + } + + void SetRawInputDeviceId(int64_t rawInputDeviceId) + { + rawInputDeviceId_ = rawInputDeviceId; + } + protected: std::list fingerList_; + InputEventType rawInputEventType_; + std::shared_ptr rawInputEvent_; + int64_t rawInputDeviceId_; }; class ACE_EXPORT TapGestureEvent : public BaseGestureEvent { diff --git a/frameworks/core/components_ng/gestures/recognizers/click_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/click_recognizer.cpp index 83267fa9669..1c29296e944 100644 --- a/frameworks/core/components_ng/gestures/recognizers/click_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/click_recognizer.cpp @@ -620,6 +620,9 @@ GestureJudgeResult ClickRecognizer::TriggerGestureJudgeCallback() info->SetRollAngle(touchPoint.rollAngle.value()); } info->SetSourceTool(touchPoint.sourceTool); + info->SetRawInputEventType(inputEventType_); + info->SetRawInputEvent(lastPointEvent_); + info->SetRawInputDeviceId(deviceId_); if (sysJudge_) { return sysJudge_(gestureInfo_, info); } 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 e4e198a8661..5b949a80842 100644 --- a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp @@ -257,6 +257,8 @@ void LongPressRecognizer::HandleTouchCancelEvent(const TouchEvent& event) if (touchPoints_.find(event.id) != touchPoints_.end()) { touchPoints_.erase(event.id); } + touchPoints_[event.id] = event; + UpdateFingerListInfo(); if (refereeState_ == RefereeState::SUCCEED && static_cast(touchPoints_.size()) == 0) { SendCallbackMsg(onActionCancel_, false, GestureCallbackType::CANCEL); lastRefereeState_ = RefereeState::READY; @@ -574,6 +576,9 @@ GestureJudgeResult LongPressRecognizer::TriggerGestureJudgeCallback() info->SetRollAngle(trackPoint.rollAngle.value()); } info->SetSourceTool(trackPoint.sourceTool); + info->SetRawInputEventType(inputEventType_); + info->SetRawInputEvent(lastPointEvent_); + info->SetRawInputDeviceId(deviceId_); if (gestureRecognizerJudgeFunc && gestureRecognizerJudgeFunc(info, Claim(this), responseLinkRecognizer_) == GestureJudgeResult::REJECT) { return GestureJudgeResult::REJECT; diff --git a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp index 0d1641baebb..3ca3216588b 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp @@ -571,6 +571,7 @@ bool PanRecognizer::HandlePanAccept() void PanRecognizer::HandleTouchCancelEvent(const TouchEvent& event) { + UpdateTouchEventInfo(event); if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; @@ -590,6 +591,8 @@ void PanRecognizer::HandleTouchCancelEvent(const TouchEvent& event) void PanRecognizer::HandleTouchCancelEvent(const AxisEvent& event) { isTouchEventFinished_ = false; + touchPoints_[event.id] = TouchEvent(); + UpdateTouchPointWithAxisEvent(event); if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; @@ -874,6 +877,9 @@ GestureJudgeResult PanRecognizer::TriggerGestureJudgeCallback() } info->SetTarget(GetEventTarget().value_or(EventTarget())); info->SetForce(lastTouchEvent_.force); + info->SetRawInputEventType(inputEventType_); + info->SetRawInputEvent(lastPointEvent_); + info->SetRawInputDeviceId(deviceId_); if (lastTouchEvent_.tiltX.has_value()) { info->SetTiltX(lastTouchEvent_.tiltX.value()); } diff --git a/frameworks/core/components_ng/gestures/recognizers/pinch_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/pinch_recognizer.cpp index 63b5ceee1a5..61ff834987b 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pinch_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/pinch_recognizer.cpp @@ -162,6 +162,7 @@ void PinchRecognizer::HandleTouchUpEvent(const TouchEvent& event) return; } + touchPoints_[event.id] = event; extraInfo_ = "activeSize: " + std::to_string(static_cast(activeFingers_.size())); if (static_cast(activeFingers_.size()) < fingers_ && refereeState_ != RefereeState::SUCCEED) { extraInfo_ += "activeFinger size not satisify."; @@ -318,6 +319,7 @@ void PinchRecognizer::HandleTouchCancelEvent(const TouchEvent& event) if (!IsActiveFinger(event.id)) { return; } + touchPoints_[event.id] = event; if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; @@ -335,6 +337,7 @@ void PinchRecognizer::HandleTouchCancelEvent(const TouchEvent& event) void PinchRecognizer::HandleTouchCancelEvent(const AxisEvent& event) { + UpdateTouchPointWithAxisEvent(event); if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; @@ -504,6 +507,9 @@ GestureJudgeResult PinchRecognizer::TriggerGestureJudgeCallback() info->SetRollAngle(lastTouchEvent_.rollAngle.value()); } info->SetSourceTool(lastTouchEvent_.sourceTool); + info->SetRawInputEventType(inputEventType_); + info->SetRawInputEvent(lastPointEvent_); + info->SetRawInputDeviceId(deviceId_); if (gestureRecognizerJudgeFunc) { return gestureRecognizerJudgeFunc(info, Claim(this), responseLinkRecognizer_); } diff --git a/frameworks/core/components_ng/gestures/recognizers/rotation_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/rotation_recognizer.cpp index 56bd78d7070..e88aec49019 100644 --- a/frameworks/core/components_ng/gestures/recognizers/rotation_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/rotation_recognizer.cpp @@ -139,6 +139,7 @@ void RotationRecognizer::HandleTouchUpEvent(const TouchEvent& event) if (!IsActiveFinger(event.id)) { return; } + touchPoints_[event.id] = event; if (static_cast(activeFingers_.size()) < DEFAULT_ROTATION_FINGERS && refereeState_ != RefereeState::SUCCEED) { extraInfo_ += "activeFinger size not satisify."; @@ -285,6 +286,7 @@ void RotationRecognizer::HandleTouchCancelEvent(const TouchEvent& event) if (!IsActiveFinger(event.id)) { return; } + touchPoints_[event.id] = event; if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { extraInfo_ += "receive cancel event."; Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); @@ -304,6 +306,7 @@ void RotationRecognizer::HandleTouchCancelEvent(const TouchEvent& event) void RotationRecognizer::HandleTouchCancelEvent(const AxisEvent& event) { + UpdateTouchPointWithAxisEvent(event); if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; @@ -455,6 +458,9 @@ GestureJudgeResult RotationRecognizer::TriggerGestureJudgeCallback() info->SetRollAngle(touchPoint.rollAngle.value()); } info->SetSourceTool(touchPoint.sourceTool); + info->SetRawInputEventType(inputEventType_); + info->SetRawInputEvent(lastPointEvent_); + info->SetRawInputDeviceId(deviceId_); if (gestureRecognizerJudgeFunc) { return gestureRecognizerJudgeFunc(info, Claim(this), responseLinkRecognizer_); } diff --git a/frameworks/core/components_ng/gestures/recognizers/swipe_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/swipe_recognizer.cpp index aabfbf96438..b20bcbcb72f 100644 --- a/frameworks/core/components_ng/gestures/recognizers/swipe_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/swipe_recognizer.cpp @@ -497,6 +497,9 @@ GestureJudgeResult SwipeRecognizer::TriggerGestureJudgeCallback() if (prevAngle_) { info->SetAngle(prevAngle_.value()); } + info->SetRawInputEventType(inputEventType_); + info->SetRawInputEvent(lastPointEvent_); + info->SetRawInputDeviceId(deviceId_); if (gestureRecognizerJudgeFunc) { return gestureRecognizerJudgeFunc(info, Claim(this), responseLinkRecognizer_); } diff --git a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp index 2ee6fccbe5b..cbbdf26f1f8 100644 --- a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp @@ -306,6 +306,22 @@ SourceTool ConvertCInputEventToolTypeToSourceTool(int32_t cInputEventToolType) } } +ArkUI_UIInputEvent_Type ConvertInputEventTypeToArkuiUIInputEventType(InputEventType type) +{ + switch (type) { + case InputEventType::TOUCH_SCREEN: + return ARKUI_UIINPUTEVENT_TYPE_TOUCH; + case InputEventType::MOUSE_BUTTON: + return ARKUI_UIINPUTEVENT_TYPE_MOUSE; + case InputEventType::AXIS: + return ARKUI_UIINPUTEVENT_TYPE_AXIS; + case InputEventType::KEYBOARD: + return ARKUI_UIINPUTEVENT_TYPE_KEY; + default: + return ARKUI_UIINPUTEVENT_TYPE_UNKNOWN; + } +} + void GetGestureEvent(ArkUIAPIEventGestureAsyncEvent& ret, GestureEvent& info) { ret.repeat = info.GetRepeat(); @@ -321,23 +337,30 @@ void GetGestureEvent(ArkUIAPIEventGestureAsyncEvent& ret, GestureEvent& info) ret.speed = info.GetSpeed(); ret.source = static_cast(info.GetSourceDevice()); ret.targetDisplayId = info.GetTargetDisplayId(); - switch (info.GetInputEventType()) { - case InputEventType::TOUCH_SCREEN : - ret.inputEventType = static_cast(ARKUI_UIINPUTEVENT_TYPE_TOUCH); - break; - case InputEventType::MOUSE_BUTTON: - ret.inputEventType = static_cast(ARKUI_UIINPUTEVENT_TYPE_MOUSE); - break; - case InputEventType::AXIS : - ret.inputEventType = static_cast(ARKUI_UIINPUTEVENT_TYPE_AXIS); - break; - case InputEventType::KEYBOARD: - ret.inputEventType = static_cast(ARKUI_UIINPUTEVENT_TYPE_KEY); - ret.deviceId = info.GetDeviceId(); - break; - default: - break; + ret.inputEventType = ConvertInputEventTypeToArkuiUIInputEventType(info.GetInputEventType()); + if (info.GetInputEventType() == InputEventType::KEYBOARD) { + ret.deviceId = info.GetDeviceId(); + } +} + +int32_t GetPointerEventAction(InputEventType type, std::shared_ptr pointerEvent) +{ + CHECK_NULL_RETURN(pointerEvent, 0); + if (type == InputEventType::AXIS) { + AxisEvent tempAxisEvent; + NG::ConvertToAxisEvent(tempAxisEvent, pointerEvent); + return static_cast(tempAxisEvent.action); + } + if (type == InputEventType::MOUSE_BUTTON) { + MouseEvent tempMouseEvent; + NG::ConvertToMouseEvent(tempMouseEvent, pointerEvent); + return static_cast(tempMouseEvent.action); + } + if (type == InputEventType::KEYBOARD) { + return static_cast(KeyAction::DOWN); } + TouchEvent tempTouchEvent = NG::ConvertToTouchEvent(pointerEvent); + return static_cast(tempTouchEvent.type); } void GetBaseGestureEvent(ArkUIAPIEventGestureAsyncEvent* ret, ArkUITouchEvent& rawInputEvent, @@ -345,6 +368,8 @@ void GetBaseGestureEvent(ArkUIAPIEventGestureAsyncEvent* ret, ArkUITouchEvent& r { rawInputEvent.sourceType = static_cast(info->GetSourceDevice()); rawInputEvent.timeStamp = info->GetTimeStamp().time_since_epoch().count(); + rawInputEvent.action = GetPointerEventAction(info->GetRawInputEventType(), info->GetRawInputEvent()); + rawInputEvent.deviceId = info->GetRawInputDeviceId(); rawInputEvent.actionTouchPoint.tiltX = info->GetTiltX().value_or(0.0f); rawInputEvent.actionTouchPoint.tiltY = info->GetTiltY().value_or(0.0f); rawInputEvent.actionTouchPoint.rollAngle = info->GetRollAngle().value_or(0.0f); @@ -806,7 +831,8 @@ void setGestureInterrupterToNodeWithUserData( } interruptInfo.responseLinkRecognizer = othersRecognizer; interruptInfo.count = count; - ArkUI_UIInputEvent inputEvent { ARKUI_UIINPUTEVENT_TYPE_TOUCH, C_TOUCH_EVENT_ID, &rawInputEvent }; + ArkUI_UIInputEvent inputEvent { ConvertInputEventTypeToArkuiUIInputEventType(info->GetRawInputEventType()), + C_TOUCH_EVENT_ID, &rawInputEvent }; inputEvent.apiVersion = AceApplicationInfo::GetInstance().GetApiTargetVersion() % API_TARGET_VERSION_MASK; ArkUIGestureEvent arkUIGestureEvent { gestureEvent, nullptr }; interruptInfo.inputEvent = &inputEvent; -- Gitee From aefdeed1f7887c393d58062560b9b49ba59084aa Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Thu, 22 May 2025 16:09:04 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=95=BF=E6=8C=89?= =?UTF-8?q?=E6=89=8B=E5=8A=BF=E4=B8=8D=E8=A7=A6=E5=8F=91cancel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangweiyuan --- .../gestures/recognizers/long_press_recognizer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 5b949a80842..72a7c91907f 100644 --- a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp @@ -254,11 +254,11 @@ void LongPressRecognizer::HandleTouchCancelEvent(const TouchEvent& event) return; } lastTouchEvent_ = event; + touchPoints_[event.id] = event; + UpdateFingerListInfo(); if (touchPoints_.find(event.id) != touchPoints_.end()) { touchPoints_.erase(event.id); } - touchPoints_[event.id] = event; - UpdateFingerListInfo(); if (refereeState_ == RefereeState::SUCCEED && static_cast(touchPoints_.size()) == 0) { SendCallbackMsg(onActionCancel_, false, GestureCallbackType::CANCEL); lastRefereeState_ = RefereeState::READY; -- Gitee From de015c971d9d227c3762880866dfddf61502e578 Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Fri, 23 May 2025 09:06:43 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E6=89=8B=E5=8A=BFmodifier=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=BA=8B=E4=BB=B6action=E7=B2=BE=E7=AE=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangweiyuan --- adapter/ohos/entrance/mmi_event_convertor.cpp | 114 ++++++++++++------ adapter/ohos/entrance/mmi_event_convertor.h | 12 ++ .../ohos/entrance/touch_event_convertor.cpp | 15 +++ .../entrance/touch_event_convertor.cpp | 15 +++ .../native/node/node_gesture_modifier.cpp | 11 +- .../native/node/touch_event_convertor.h | 3 + 6 files changed, 122 insertions(+), 48 deletions(-) diff --git a/adapter/ohos/entrance/mmi_event_convertor.cpp b/adapter/ohos/entrance/mmi_event_convertor.cpp index 5fac041735d..99618e0a0c2 100644 --- a/adapter/ohos/entrance/mmi_event_convertor.cpp +++ b/adapter/ohos/entrance/mmi_event_convertor.cpp @@ -254,7 +254,7 @@ TouchEvent ConvertTouchEvent(const std::shared_ptr& pointerEv return event; } -void SetTouchEventType(int32_t orgAction, TouchEvent& event) +TouchType ConvertTouchEventType(int32_t originAction) { std::map actionMap = { { OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL, TouchType::CANCEL }, @@ -273,62 +273,77 @@ void SetTouchEventType(int32_t orgAction, TouchEvent& event) { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_IN, TouchType::PROXIMITY_IN }, { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_OUT, TouchType::PROXIMITY_OUT }, }; - auto typeIter = actionMap.find(orgAction); + auto typeIter = actionMap.find(originAction); if (typeIter == actionMap.end()) { + return TouchType::UNKNOWN; + } + return typeIter->second; +} + +void SetTouchEventType(int32_t orgAction, TouchEvent& event) +{ + auto touchType = ConvertTouchEventType(orgAction); + if (touchType == TouchType::UNKNOWN) { TAG_LOGI(AceLogTag::ACE_INPUTKEYFLOW, "unknown touch type"); return; } - event.type = typeIter->second; - if (typeIter->second == TouchType::PULL_DOWN || typeIter->second == TouchType::PULL_MOVE || - typeIter->second == TouchType::PULL_UP || typeIter->second == TouchType::PULL_IN_WINDOW || - typeIter->second == TouchType::PULL_OUT_WINDOW) { - event.pullType = typeIter->second; + event.type = touchType; + if (touchType == TouchType::PULL_DOWN || touchType == TouchType::PULL_MOVE || touchType == TouchType::PULL_UP || + touchType == TouchType::PULL_IN_WINDOW || touchType == TouchType::PULL_OUT_WINDOW) { + event.pullType = touchType; } } -void GetMouseEventAction(int32_t action, MouseEvent& events, bool isSceneBoardWindow) +MouseAction ConvertMouseEventAction(int32_t originAction) { - switch (action) { + switch (originAction) { case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN: - events.action = MouseAction::PRESS; - break; + return MouseAction::PRESS; case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP: - events.action = MouseAction::RELEASE; - break; + return MouseAction::RELEASE; case OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW: - events.action = MouseAction::WINDOW_ENTER; - break; + return MouseAction::WINDOW_ENTER; case OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW: - events.action = MouseAction::WINDOW_LEAVE; - break; + return MouseAction::WINDOW_LEAVE; case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE: - events.action = MouseAction::MOVE; - break; + return MouseAction::MOVE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN: + return MouseAction::PRESS; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE: + return MouseAction::MOVE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW: + return MouseAction::WINDOW_ENTER; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW: + return MouseAction::WINDOW_LEAVE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP: + return MouseAction::RELEASE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL: + return MouseAction::CANCEL; + default: + return MouseAction::NONE; + } +} + +void GetMouseEventAction(int32_t action, MouseEvent& events, bool isSceneBoardWindow) +{ + events.action = ConvertMouseEventAction(action); + switch (action) { case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN: - events.action = MouseAction::PRESS; events.pullAction = MouseAction::PULL_DOWN; break; case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE: - events.action = MouseAction::MOVE; events.pullAction = MouseAction::PULL_MOVE; break; case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW: - events.action = MouseAction::WINDOW_ENTER; events.pullAction = MouseAction::PULL_MOVE; return; case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW: - events.action = MouseAction::WINDOW_LEAVE; events.pullAction = MouseAction::PULL_MOVE; return; case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP: - events.action = MouseAction::RELEASE; events.pullAction = MouseAction::PULL_UP; break; - case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL: - events.action = MouseAction::CANCEL; - break; default: - events.action = MouseAction::NONE; break; } } @@ -410,30 +425,30 @@ void ConvertMouseEvent( } } -void GetAxisEventAction(int32_t action, AxisEvent& event) +AxisAction ConvertAxisEventAction(int32_t originAction) { - switch (action) { + switch (originAction) { case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN: case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN: - event.action = AxisAction::BEGIN; - break; + return AxisAction::BEGIN; case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE: case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE: - event.action = AxisAction::UPDATE; - break; + return AxisAction::UPDATE; case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_END: case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_END: - event.action = AxisAction::END; - break; + return AxisAction::END; case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL: - event.action = AxisAction::CANCEL; - break; + return AxisAction::CANCEL; default: - event.action = AxisAction::NONE; - break; + return AxisAction::NONE; } } +void GetAxisEventAction(int32_t action, AxisEvent& event) +{ + event.action = ConvertAxisEventAction(action); +} + void GetNonPointerAxisEventAction(int32_t action, NG::FocusAxisEvent& event) { switch (action) { @@ -971,4 +986,23 @@ void CalculateWindowCoordinate(const NG::OffsetF& offsetF, const std::shared_ptr point->UpdatePointerItem(id, item); } } + + +TouchType GetTouchTypeFromPointerEvent(const std::shared_ptr& pointerEvent) +{ + auto pointerAction = pointerEvent->GetPointerAction(); + return ConvertTouchEventType(pointerAction); +} + +AxisAction GetAxisActionFromPointerEvent(const std::shared_ptr& pointerEvent) +{ + auto pointerAction = pointerEvent->GetPointerAction(); + return ConvertAxisEventAction(pointerAction); +} + +MouseAction GetMouseActionFromPointerEvent(const std::shared_ptr& pointerEvent) +{ + auto pointerAction = pointerEvent->GetPointerAction(); + return ConvertMouseEventAction(pointerAction); +} } // namespace OHOS::Ace::Platform diff --git a/adapter/ohos/entrance/mmi_event_convertor.h b/adapter/ohos/entrance/mmi_event_convertor.h index 10a8b88aaa3..7ddef7375af 100644 --- a/adapter/ohos/entrance/mmi_event_convertor.h +++ b/adapter/ohos/entrance/mmi_event_convertor.h @@ -81,6 +81,12 @@ TouchEvent ConvertTouchEvent(const std::shared_ptr& pointerEv void SetTouchEventType(int32_t orgAction, TouchEvent& event); +TouchType ConvertTouchEventType(int32_t originAction); + +MouseAction ConvertMouseEventAction(int32_t originAction); + +AxisAction ConvertAxisEventAction(int32_t originAction); + // when the event didn't do touchtest, useRealtimeMatrix need to set true to get current matrix. void CalculatePointerEvent(const std::shared_ptr& point, const RefPtr& frameNode, bool useRealtimeMatrix = false); @@ -116,6 +122,12 @@ bool GetPointerEventToolType(const std::shared_ptr& pointerEv void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEvent* arkUITouchEventCloned); void SetPostPointerEvent(const MMI::PointerEvent* pointerEvent, TouchEvent& touchEvent); + +TouchType GetTouchTypeFromPointerEvent(const std::shared_ptr& pointerEvent); + +AxisAction GetAxisActionFromPointerEvent(const std::shared_ptr& pointerEvent); + +MouseAction GetMouseActionFromPointerEvent(const std::shared_ptr& pointerEvent); } // namespace OHOS::Ace::Platform #endif // FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_MMI_EVENT_CONVERTOR_H diff --git a/adapter/ohos/entrance/touch_event_convertor.cpp b/adapter/ohos/entrance/touch_event_convertor.cpp index 52dd3d86fef..592bfaadccb 100644 --- a/adapter/ohos/entrance/touch_event_convertor.cpp +++ b/adapter/ohos/entrance/touch_event_convertor.cpp @@ -44,4 +44,19 @@ void SetPostPointerEvent(const MMI::PointerEvent* pointerEvent, TouchEvent& touc { Platform::SetPostPointerEvent(pointerEvent, touchEvent); } + +TouchType GetTouchEventType(const std::shared_ptr& pointerEvent) +{ + return Platform::GetTouchTypeFromPointerEvent(pointerEvent); +} + +AxisAction GetAxisEventType(const std::shared_ptr& pointerEvent) +{ + return Platform::GetAxisActionFromPointerEvent(pointerEvent); +} + +MouseAction GetMouseEventType(const std::shared_ptr& pointerEvent) +{ + return Platform::GetMouseActionFromPointerEvent(pointerEvent); +} } \ No newline at end of file diff --git a/adapter/preview/entrance/touch_event_convertor.cpp b/adapter/preview/entrance/touch_event_convertor.cpp index 50ae62cace5..0cd22bee3c5 100644 --- a/adapter/preview/entrance/touch_event_convertor.cpp +++ b/adapter/preview/entrance/touch_event_convertor.cpp @@ -28,4 +28,19 @@ void ConvertToAxisEvent(AxisEvent& event, const std::shared_ptr& pointerEvent) +{ + return TouchType::UNKNOWN; +} + +AxisAction GetAxisEventType(const std::shared_ptr& pointerEvent) +{ + return AxisAction::NONE; +} + +MouseAction GetMouseEventType(const std::shared_ptr& pointerEvent) +{ + return MouseAction::NONE; +} } \ No newline at end of file diff --git a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp index cbbdf26f1f8..75b738ced07 100644 --- a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp @@ -347,20 +347,15 @@ int32_t GetPointerEventAction(InputEventType type, std::shared_ptr(tempAxisEvent.action); + return static_cast(NG::GetAxisEventType(pointerEvent)); } if (type == InputEventType::MOUSE_BUTTON) { - MouseEvent tempMouseEvent; - NG::ConvertToMouseEvent(tempMouseEvent, pointerEvent); - return static_cast(tempMouseEvent.action); + return static_cast(NG::GetMouseEventType(pointerEvent)); } if (type == InputEventType::KEYBOARD) { return static_cast(KeyAction::DOWN); } - TouchEvent tempTouchEvent = NG::ConvertToTouchEvent(pointerEvent); - return static_cast(tempTouchEvent.type); + return static_cast(NG::GetTouchEventType(pointerEvent)); } void GetBaseGestureEvent(ArkUIAPIEventGestureAsyncEvent* ret, ArkUITouchEvent& rawInputEvent, diff --git a/frameworks/core/interfaces/native/node/touch_event_convertor.h b/frameworks/core/interfaces/native/node/touch_event_convertor.h index 72112d3f905..2c8d24235ec 100644 --- a/frameworks/core/interfaces/native/node/touch_event_convertor.h +++ b/frameworks/core/interfaces/native/node/touch_event_convertor.h @@ -26,5 +26,8 @@ namespace OHOS::Ace::NG { void ConvertToAxisEvent(AxisEvent& event, const std::shared_ptr& srcPointerEvent); void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEvent* arkUITouchEventCloned); void SetPostPointerEvent(const MMI::PointerEvent* pointerEvent, TouchEvent& touchEvent); + TouchType GetTouchEventType(const std::shared_ptr& pointerEvent); + AxisAction GetAxisEventType(const std::shared_ptr& pointerEvent); + MouseAction GetMouseEventType(const std::shared_ptr& pointerEvent); } #endif \ No newline at end of file -- Gitee From 774391823c535c0d4eec51c4223fff21385a2c0f Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Fri, 23 May 2025 18:32:18 +0800 Subject: [PATCH 4/7] =?UTF-8?q?longpress=E6=89=8B=E5=8A=BFaction=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangweiyuan --- .../core/components_ng/gestures/base_gesture_event.h | 11 +++++++++++ .../gestures/recognizers/long_press_recognizer.cpp | 11 +++++++++-- .../gestures/recognizers/long_press_recognizer.h | 1 + frameworks/core/gestures/gesture_event.h | 11 +++++++++++ .../interfaces/native/node/node_gesture_modifier.cpp | 9 +++++---- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/frameworks/core/components_ng/gestures/base_gesture_event.h b/frameworks/core/components_ng/gestures/base_gesture_event.h index 40b3fee2979..1dc9dfaaa3f 100644 --- a/frameworks/core/components_ng/gestures/base_gesture_event.h +++ b/frameworks/core/components_ng/gestures/base_gesture_event.h @@ -70,11 +70,22 @@ public: rawInputDeviceId_ = rawInputDeviceId; } + void SetLastAction(int32_t action) + { + lastAction_.emplace(action); + } + + std::optional GetLastAction() const + { + return lastAction_; + } + protected: std::list fingerList_; InputEventType rawInputEventType_; std::shared_ptr rawInputEvent_; int64_t rawInputDeviceId_; + std::optional lastAction_; }; class ACE_EXPORT TapGestureEvent : public BaseGestureEvent { 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 72a7c91907f..ddcd94713c0 100644 --- a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp @@ -122,7 +122,9 @@ void LongPressRecognizer::ThumbnailTimer(int32_t time) void LongPressRecognizer::HandleTouchDownEvent(const TouchEvent& event) { + LOGI("LongPress HandleTouchDownEvent"); extraInfo_ = ""; + lastAction_ = static_cast(TouchType::DOWN); if (!firstInputTime_.has_value()) { firstInputTime_ = event.time; } @@ -188,6 +190,8 @@ void LongPressRecognizer::HandleTouchDownEvent(const TouchEvent& event) void LongPressRecognizer::HandleTouchUpEvent(const TouchEvent& event) { + LOGI("LongPress HandleTouchUpEvent"); + lastAction_ = static_cast(TouchType::UP); auto context = PipelineContext::GetCurrentContextSafelyWithCheck(); CHECK_NULL_VOID(context); context->RemoveGestureTask(task_); @@ -229,6 +233,8 @@ void LongPressRecognizer::HandleTouchUpEvent(const TouchEvent& event) void LongPressRecognizer::HandleTouchMoveEvent(const TouchEvent& event) { lastTouchEvent_.pressedKeyCodes_ = event.pressedKeyCodes_; + LOGI("LongPress HandleTouchMoveEvent"); + lastAction_ = static_cast(TouchType::MOVE); if (static_cast(touchPoints_.size()) < fingers_) { return; } @@ -253,9 +259,8 @@ void LongPressRecognizer::HandleTouchCancelEvent(const TouchEvent& event) if (refereeState_ == RefereeState::FAIL) { return; } + lastAction_ = static_cast(TouchType::CANCEL); lastTouchEvent_ = event; - touchPoints_[event.id] = event; - UpdateFingerListInfo(); if (touchPoints_.find(event.id) != touchPoints_.end()) { touchPoints_.erase(event.id); } @@ -401,6 +406,7 @@ void LongPressRecognizer::SendCallbackMsg( } if (callback && *callback) { GestureEvent info; + info.SetLastAction(lastAction_); info.SetGestureTypeName(GestureTypeName::LONG_PRESS_GESTURE); info.SetTimeStamp(time_); info.SetRepeat(isRepeat); @@ -579,6 +585,7 @@ GestureJudgeResult LongPressRecognizer::TriggerGestureJudgeCallback() info->SetRawInputEventType(inputEventType_); info->SetRawInputEvent(lastPointEvent_); info->SetRawInputDeviceId(deviceId_); + info->SetLastAction(lastAction_); if (gestureRecognizerJudgeFunc && gestureRecognizerJudgeFunc(info, Claim(this), responseLinkRecognizer_) == GestureJudgeResult::REJECT) { return GestureJudgeResult::REJECT; 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 11793f350be..7f2f1fd6ac5 100644 --- a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.h +++ b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.h @@ -173,6 +173,7 @@ private: DelayedTask task_; OnAccessibilityEventFunc onAccessibilityEventFunc_ = nullptr; std::unique_ptr longPressRecorder_; + int32_t lastAction_ = 0; }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/gestures/gesture_event.h b/frameworks/core/gestures/gesture_event.h index cb6b9205623..156a1798b0c 100644 --- a/frameworks/core/gestures/gesture_event.h +++ b/frameworks/core/gestures/gesture_event.h @@ -304,6 +304,16 @@ public: { return gestureType_; } + + void SetLastAction(int32_t action) + { + lastAction_.emplace(action); + } + + std::optional GetLastAction() const + { + return lastAction_; + } #ifdef SECURITY_COMPONENT_ENABLE void SetDisplayX(double displayX) { @@ -375,6 +385,7 @@ private: float inputXDeltaSlope_ = 0.0f; float inputYDeltaSlope_ = 0.0f; GestureTypeName gestureType_ = GestureTypeName::UNKNOWN; + std::optional lastAction_; }; using GestureEventFunc = std::function; diff --git a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp index 75b738ced07..4b8ce47355a 100644 --- a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp @@ -267,7 +267,7 @@ void ConvertIMMEventToTouchEvent(GestureEvent& info, ArkUITouchEvent& touchEvent touchEvent.deviceId = info.GetDeviceId(); // modifierkeystates touchEvent.modifierKeyState = NodeModifier::CalculateModifierKeyState(info.GetPressedKeyCodes()); - touchEvent.action = static_cast(tempTouchEvent.type); + touchEvent.action = info.GetLastAction().value_or(static_cast(tempTouchEvent.type)); touchEvent.sourceType = static_cast(tempTouchEvent.sourceType); touchEvent.timeStamp = tempTouchEvent.time.time_since_epoch().count(); touchEvent.actionTouchPoint.pressure = tempTouchEvent.force; @@ -363,7 +363,8 @@ void GetBaseGestureEvent(ArkUIAPIEventGestureAsyncEvent* ret, ArkUITouchEvent& r { rawInputEvent.sourceType = static_cast(info->GetSourceDevice()); rawInputEvent.timeStamp = info->GetTimeStamp().time_since_epoch().count(); - rawInputEvent.action = GetPointerEventAction(info->GetRawInputEventType(), info->GetRawInputEvent()); + rawInputEvent.action = + info->GetLastAction().value_or(GetPointerEventAction(info->GetRawInputEventType(), info->GetRawInputEvent())); rawInputEvent.deviceId = info->GetRawInputDeviceId(); rawInputEvent.actionTouchPoint.tiltX = info->GetTiltX().value_or(0.0f); rawInputEvent.actionTouchPoint.tiltY = info->GetTiltY().value_or(0.0f); @@ -461,7 +462,7 @@ void ConvertIMMEventToMouseEvent(GestureEvent& info, ArkUIMouseEvent& mouseEvent mouseEvent.deviceId = info.GetDeviceId(); // modifierkeystates mouseEvent.modifierKeyState = NodeModifier::CalculateModifierKeyState(info.GetPressedKeyCodes()); - mouseEvent.action = static_cast(tempMouseEvent.action); + mouseEvent.action = info.GetLastAction().value_or(static_cast(tempMouseEvent.action)); mouseEvent.sourceType = static_cast(tempMouseEvent.sourceType); mouseEvent.timeStamp = tempMouseEvent.time.time_since_epoch().count(); mouseEvent.actionTouchPoint.pressure = 0.0f; @@ -495,7 +496,7 @@ void ConvertIMMEventToAxisEvent(GestureEvent& info, ArkUIAxisEvent& axisEvent) axisEvent.deviceId = info.GetDeviceId(); // modifierkeystates axisEvent.modifierKeyState = NodeModifier::CalculateModifierKeyState(info.GetPressedKeyCodes()); - axisEvent.action = static_cast(tempAxisEvent.action); + axisEvent.action = info.GetLastAction().value_or(static_cast(tempAxisEvent.action)); axisEvent.sourceType = static_cast(tempAxisEvent.sourceType); axisEvent.timeStamp = tempAxisEvent.time.time_since_epoch().count(); axisEvent.horizontalAxis = tempAxisEvent.horizontalAxis; -- Gitee From c46a8cc233907b79794cdff07a20c9f2729ab2d3 Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Tue, 27 May 2025 18:24:52 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9pan=20tdd=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangweiyuan --- .../gestures/recognizers/long_press_recognizer.cpp | 3 --- .../gestures/recognizers/pan_recognizer.cpp | 13 ++++++++++--- .../gestures/recognizers/pan_recognizer.h | 1 + 3 files changed, 11 insertions(+), 6 deletions(-) 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 ddcd94713c0..70422058a4c 100644 --- a/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/long_press_recognizer.cpp @@ -122,7 +122,6 @@ void LongPressRecognizer::ThumbnailTimer(int32_t time) void LongPressRecognizer::HandleTouchDownEvent(const TouchEvent& event) { - LOGI("LongPress HandleTouchDownEvent"); extraInfo_ = ""; lastAction_ = static_cast(TouchType::DOWN); if (!firstInputTime_.has_value()) { @@ -190,7 +189,6 @@ void LongPressRecognizer::HandleTouchDownEvent(const TouchEvent& event) void LongPressRecognizer::HandleTouchUpEvent(const TouchEvent& event) { - LOGI("LongPress HandleTouchUpEvent"); lastAction_ = static_cast(TouchType::UP); auto context = PipelineContext::GetCurrentContextSafelyWithCheck(); CHECK_NULL_VOID(context); @@ -233,7 +231,6 @@ void LongPressRecognizer::HandleTouchUpEvent(const TouchEvent& event) void LongPressRecognizer::HandleTouchMoveEvent(const TouchEvent& event) { lastTouchEvent_.pressedKeyCodes_ = event.pressedKeyCodes_; - LOGI("LongPress HandleTouchMoveEvent"); lastAction_ = static_cast(TouchType::MOVE); if (static_cast(touchPoints_.size()) < fingers_) { return; diff --git a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp index 3ca3216588b..1b8f498a715 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp +++ b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.cpp @@ -228,6 +228,7 @@ void PanRecognizer::UpdateAxisPointInVelocityTracker(const AxisEvent& event, boo void PanRecognizer::HandleTouchDownEvent(const TouchEvent& event) { extraInfo_ = ""; + lastAction_ = static_cast(TouchType::DOWN); isTouchEventFinished_ = false; if (!firstInputTime_.has_value()) { firstInputTime_ = event.time; @@ -281,6 +282,7 @@ void PanRecognizer::HandleTouchDownEvent(const TouchEvent& event) void PanRecognizer::HandleTouchDownEvent(const AxisEvent& event) { extraInfo_ = ""; + lastAction_ = static_cast(AxisAction::BEGIN); isTouchEventFinished_ = false; if (!firstInputTime_.has_value()) { firstInputTime_ = event.time; @@ -327,6 +329,7 @@ void PanRecognizer::HandleTouchDownEvent(const AxisEvent& event) void PanRecognizer::HandleTouchUpEvent(const TouchEvent& event) { extraInfo_ = "currentFingers: " + std::to_string(currentFingers_) + " fingers: " + std::to_string(fingers_); + lastAction_ = static_cast(TouchType::UP); fingersId_.erase(event.id); if (currentFingers_ < fingers_) { if (isNeedResetVoluntarily_ && currentFingers_ == 1) { @@ -383,6 +386,7 @@ void PanRecognizer::HandleTouchUpEvent(const TouchEvent& event) void PanRecognizer::HandleTouchUpEvent(const AxisEvent& event) { isTouchEventFinished_ = false; + lastAction_ = static_cast(AxisAction::END); // if axisEvent received rotateEvent, no need to active Pan recognizer. if (event.isRotationEvent) { return; @@ -422,6 +426,7 @@ void PanRecognizer::HandleTouchUpEvent(const AxisEvent& event) void PanRecognizer::HandleTouchMoveEvent(const TouchEvent& event) { isTouchEventFinished_ = false; + lastAction_ = static_cast(TouchType::MOVE); if (static_cast(touchPoints_.size()) < fingers_) { return; } @@ -495,6 +500,7 @@ void PanRecognizer::UpdateAxisDeltaTransform(const AxisEvent& event) void PanRecognizer::HandleTouchMoveEvent(const AxisEvent& event) { isTouchEventFinished_ = false; + lastAction_ = static_cast(AxisAction::UPDATE); if (fingers_ != AXIS_PAN_FINGERS || event.isRotationEvent) { return; } @@ -571,7 +577,7 @@ bool PanRecognizer::HandlePanAccept() void PanRecognizer::HandleTouchCancelEvent(const TouchEvent& event) { - UpdateTouchEventInfo(event); + lastAction_ = static_cast(TouchType::CANCEL); if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; @@ -591,8 +597,7 @@ void PanRecognizer::HandleTouchCancelEvent(const TouchEvent& event) void PanRecognizer::HandleTouchCancelEvent(const AxisEvent& event) { isTouchEventFinished_ = false; - touchPoints_[event.id] = TouchEvent(); - UpdateTouchPointWithAxisEvent(event); + lastAction_ = static_cast(AxisAction::CANCEL); if ((refereeState_ != RefereeState::SUCCEED) && (refereeState_ != RefereeState::FAIL)) { Adjudicate(AceType::Claim(this), GestureDisposal::REJECT); return; @@ -802,6 +807,7 @@ GestureEvent PanRecognizer::GetGestureEventInfo() info.SetPointerEvent(lastPointEvent_); info.SetIsPostEventResult(isPostEventResult_); info.SetPostEventNodeId(lastTouchEvent_.postEventNodeId); + info.SetLastAction(lastAction_); return info; } @@ -880,6 +886,7 @@ GestureJudgeResult PanRecognizer::TriggerGestureJudgeCallback() info->SetRawInputEventType(inputEventType_); info->SetRawInputEvent(lastPointEvent_); info->SetRawInputDeviceId(deviceId_); + info->SetLastAction(lastAction_); if (lastTouchEvent_.tiltX.has_value()) { info->SetTiltX(lastTouchEvent_.tiltX.value()); } diff --git a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h index 7997f9416a2..9fe026e6cae 100644 --- a/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h +++ b/frameworks/core/components_ng/gestures/recognizers/pan_recognizer.h @@ -200,6 +200,7 @@ private: OnPanDistanceFunc onChangeDistance_; // this callback will be triggered when pan end, but the enable state is false std::unique_ptr panEndOnDisableState_; + int32_t lastAction_ = 0; }; } // namespace OHOS::Ace::NG -- Gitee From c448d687e77d88e1f65b7f5acac1fbef65db898b Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Tue, 27 May 2025 20:47:51 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E6=A3=80=E8=A7=86=E6=84=8F=E8=A7=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangweiyuan --- adapter/ohos/entrance/mmi_event_convertor.cpp | 156 +++++++++--------- adapter/ohos/entrance/mmi_event_convertor.h | 6 - .../gestures/base_gesture_event.h | 4 +- .../native/node/node_gesture_modifier.cpp | 7 +- 4 files changed, 84 insertions(+), 89 deletions(-) diff --git a/adapter/ohos/entrance/mmi_event_convertor.cpp b/adapter/ohos/entrance/mmi_event_convertor.cpp index 99618e0a0c2..552f83e8bc5 100644 --- a/adapter/ohos/entrance/mmi_event_convertor.cpp +++ b/adapter/ohos/entrance/mmi_event_convertor.cpp @@ -27,6 +27,81 @@ constexpr int32_t ANGLE_90 = 90; constexpr int32_t ANGLE_180 = 180; constexpr int32_t ANGLE_270 = 270; constexpr double SIZE_DIVIDE = 2.0; + +TouchType ConvertTouchEventType(int32_t originAction) +{ + std::map actionMap = { + { OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL, TouchType::CANCEL }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN, TouchType::DOWN }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE, TouchType::MOVE }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_UP, TouchType::UP }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN, TouchType::PULL_DOWN }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE, TouchType::PULL_MOVE }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP, TouchType::PULL_UP }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW, TouchType::PULL_IN_WINDOW }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW, TouchType::PULL_OUT_WINDOW }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_ENTER, TouchType::HOVER_ENTER }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_MOVE, TouchType::HOVER_MOVE }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_EXIT, TouchType::HOVER_EXIT }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_CANCEL, TouchType::HOVER_CANCEL }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_IN, TouchType::PROXIMITY_IN }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_OUT, TouchType::PROXIMITY_OUT }, + }; + auto typeIter = actionMap.find(originAction); + if (typeIter == actionMap.end()) { + return TouchType::UNKNOWN; + } + return typeIter->second; +} + +MouseAction ConvertMouseEventAction(int32_t originAction) +{ + switch (originAction) { + case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN: + return MouseAction::PRESS; + case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP: + return MouseAction::RELEASE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW: + return MouseAction::WINDOW_ENTER; + case OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW: + return MouseAction::WINDOW_LEAVE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE: + return MouseAction::MOVE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN: + return MouseAction::PRESS; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE: + return MouseAction::MOVE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW: + return MouseAction::WINDOW_ENTER; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW: + return MouseAction::WINDOW_LEAVE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP: + return MouseAction::RELEASE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL: + return MouseAction::CANCEL; + default: + return MouseAction::NONE; + } +} + +AxisAction ConvertAxisEventAction(int32_t originAction) +{ + switch (originAction) { + case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN: + case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN: + return AxisAction::BEGIN; + case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE: + case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE: + return AxisAction::UPDATE; + case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_END: + case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_END: + return AxisAction::END; + case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL: + return AxisAction::CANCEL; + default: + return AxisAction::NONE; + } +} } // namespace SourceTool GetSourceTool(int32_t orgToolType) @@ -254,37 +329,11 @@ TouchEvent ConvertTouchEvent(const std::shared_ptr& pointerEv return event; } -TouchType ConvertTouchEventType(int32_t originAction) -{ - std::map actionMap = { - { OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL, TouchType::CANCEL }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN, TouchType::DOWN }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE, TouchType::MOVE }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_UP, TouchType::UP }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN, TouchType::PULL_DOWN }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE, TouchType::PULL_MOVE }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP, TouchType::PULL_UP }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW, TouchType::PULL_IN_WINDOW }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW, TouchType::PULL_OUT_WINDOW }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_ENTER, TouchType::HOVER_ENTER }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_MOVE, TouchType::HOVER_MOVE }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_EXIT, TouchType::HOVER_EXIT }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_CANCEL, TouchType::HOVER_CANCEL }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_IN, TouchType::PROXIMITY_IN }, - { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_OUT, TouchType::PROXIMITY_OUT }, - }; - auto typeIter = actionMap.find(originAction); - if (typeIter == actionMap.end()) { - return TouchType::UNKNOWN; - } - return typeIter->second; -} - void SetTouchEventType(int32_t orgAction, TouchEvent& event) { auto touchType = ConvertTouchEventType(orgAction); if (touchType == TouchType::UNKNOWN) { - TAG_LOGI(AceLogTag::ACE_INPUTKEYFLOW, "unknown touch type"); + TAG_LOGE(AceLogTag::ACE_INPUTKEYFLOW, "unknown touch type"); return; } event.type = touchType; @@ -294,36 +343,6 @@ void SetTouchEventType(int32_t orgAction, TouchEvent& event) } } -MouseAction ConvertMouseEventAction(int32_t originAction) -{ - switch (originAction) { - case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN: - return MouseAction::PRESS; - case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP: - return MouseAction::RELEASE; - case OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW: - return MouseAction::WINDOW_ENTER; - case OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW: - return MouseAction::WINDOW_LEAVE; - case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE: - return MouseAction::MOVE; - case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN: - return MouseAction::PRESS; - case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE: - return MouseAction::MOVE; - case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW: - return MouseAction::WINDOW_ENTER; - case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW: - return MouseAction::WINDOW_LEAVE; - case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP: - return MouseAction::RELEASE; - case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL: - return MouseAction::CANCEL; - default: - return MouseAction::NONE; - } -} - void GetMouseEventAction(int32_t action, MouseEvent& events, bool isSceneBoardWindow) { events.action = ConvertMouseEventAction(action); @@ -425,25 +444,6 @@ void ConvertMouseEvent( } } -AxisAction ConvertAxisEventAction(int32_t originAction) -{ - switch (originAction) { - case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN: - case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN: - return AxisAction::BEGIN; - case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE: - case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE: - return AxisAction::UPDATE; - case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_END: - case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_END: - return AxisAction::END; - case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL: - return AxisAction::CANCEL; - default: - return AxisAction::NONE; - } -} - void GetAxisEventAction(int32_t action, AxisEvent& event) { event.action = ConvertAxisEventAction(action); @@ -987,21 +987,23 @@ void CalculateWindowCoordinate(const NG::OffsetF& offsetF, const std::shared_ptr } } - TouchType GetTouchTypeFromPointerEvent(const std::shared_ptr& pointerEvent) { + CHECK_NULL_RETURN(pointerEvent, TouchType::UNKNOWN); auto pointerAction = pointerEvent->GetPointerAction(); return ConvertTouchEventType(pointerAction); } AxisAction GetAxisActionFromPointerEvent(const std::shared_ptr& pointerEvent) { + CHECK_NULL_RETURN(pointerEvent, AxisAction::NONE); auto pointerAction = pointerEvent->GetPointerAction(); return ConvertAxisEventAction(pointerAction); } MouseAction GetMouseActionFromPointerEvent(const std::shared_ptr& pointerEvent) { + CHECK_NULL_RETURN(pointerEvent, MouseAction::NONE); auto pointerAction = pointerEvent->GetPointerAction(); return ConvertMouseEventAction(pointerAction); } diff --git a/adapter/ohos/entrance/mmi_event_convertor.h b/adapter/ohos/entrance/mmi_event_convertor.h index 7ddef7375af..f0678b2ee2f 100644 --- a/adapter/ohos/entrance/mmi_event_convertor.h +++ b/adapter/ohos/entrance/mmi_event_convertor.h @@ -81,12 +81,6 @@ TouchEvent ConvertTouchEvent(const std::shared_ptr& pointerEv void SetTouchEventType(int32_t orgAction, TouchEvent& event); -TouchType ConvertTouchEventType(int32_t originAction); - -MouseAction ConvertMouseEventAction(int32_t originAction); - -AxisAction ConvertAxisEventAction(int32_t originAction); - // when the event didn't do touchtest, useRealtimeMatrix need to set true to get current matrix. void CalculatePointerEvent(const std::shared_ptr& point, const RefPtr& frameNode, bool useRealtimeMatrix = false); diff --git a/frameworks/core/components_ng/gestures/base_gesture_event.h b/frameworks/core/components_ng/gestures/base_gesture_event.h index 1dc9dfaaa3f..00cd638786b 100644 --- a/frameworks/core/components_ng/gestures/base_gesture_event.h +++ b/frameworks/core/components_ng/gestures/base_gesture_event.h @@ -82,9 +82,9 @@ public: protected: std::list fingerList_; - InputEventType rawInputEventType_; + InputEventType rawInputEventType_ = InputEventType::TOUCH_SCREEN; std::shared_ptr rawInputEvent_; - int64_t rawInputDeviceId_; + int64_t rawInputDeviceId_ = 0; std::optional lastAction_; }; diff --git a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp index 4b8ce47355a..7981ca7193b 100644 --- a/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_gesture_modifier.cpp @@ -338,23 +338,22 @@ void GetGestureEvent(ArkUIAPIEventGestureAsyncEvent& ret, GestureEvent& info) ret.source = static_cast(info.GetSourceDevice()); ret.targetDisplayId = info.GetTargetDisplayId(); ret.inputEventType = ConvertInputEventTypeToArkuiUIInputEventType(info.GetInputEventType()); - if (info.GetInputEventType() == InputEventType::KEYBOARD) { - ret.deviceId = info.GetDeviceId(); - } } int32_t GetPointerEventAction(InputEventType type, std::shared_ptr pointerEvent) { - CHECK_NULL_RETURN(pointerEvent, 0); if (type == InputEventType::AXIS) { + CHECK_NULL_RETURN(pointerEvent, static_cast(AxisAction::NONE)); return static_cast(NG::GetAxisEventType(pointerEvent)); } if (type == InputEventType::MOUSE_BUTTON) { + CHECK_NULL_RETURN(pointerEvent, static_cast(MouseAction::NONE)); return static_cast(NG::GetMouseEventType(pointerEvent)); } if (type == InputEventType::KEYBOARD) { return static_cast(KeyAction::DOWN); } + CHECK_NULL_RETURN(pointerEvent, static_cast(TouchType::UNKNOWN)); return static_cast(NG::GetTouchEventType(pointerEvent)); } -- Gitee From eafed0ab3f670ee2927a51acfce5af42136c2e8f Mon Sep 17 00:00:00 2001 From: wangweiyuan Date: Tue, 27 May 2025 22:58:08 +0800 Subject: [PATCH 7/7] add tdd Signed-off-by: wangweiyuan --- .../gestures/base_gesture_event.h | 2 +- .../gestures/click_recognizer_test_ng.cpp | 26 +++++++++++++++++ .../long_press_recognizer_test_ng.cpp | 29 +++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/frameworks/core/components_ng/gestures/base_gesture_event.h b/frameworks/core/components_ng/gestures/base_gesture_event.h index 00cd638786b..62d366abf16 100644 --- a/frameworks/core/components_ng/gestures/base_gesture_event.h +++ b/frameworks/core/components_ng/gestures/base_gesture_event.h @@ -82,7 +82,7 @@ public: protected: std::list fingerList_; - InputEventType rawInputEventType_ = InputEventType::TOUCH_SCREEN; + InputEventType rawInputEventType_ = InputEventType::TOUCH_SCREEN; std::shared_ptr rawInputEvent_; int64_t rawInputDeviceId_ = 0; std::optional lastAction_; diff --git a/test/unittest/core/gestures/click_recognizer_test_ng.cpp b/test/unittest/core/gestures/click_recognizer_test_ng.cpp index 1cbb8e91bee..b155e595c04 100644 --- a/test/unittest/core/gestures/click_recognizer_test_ng.cpp +++ b/test/unittest/core/gestures/click_recognizer_test_ng.cpp @@ -1963,4 +1963,30 @@ HWTEST_F(ClickRecognizerTestNg, ClickRecognizerTypeTest003, TestSize.Level1) clickRecognizer->HandleReports(info, GestureCallbackType::START); EXPECT_EQ(clickRecognizer->GetRecognizerType(), GestureTypeName::TAP_GESTURE); } + +/** + * @tc.name: TriggerGestureJudgeCallbackTest002 + * @tc.desc: Test TriggerGestureJudgeCallback + * @tc.type: FUNC + */ +HWTEST_F(ClickRecognizerTestNg, TriggerGestureJudgeCallbackTest002, TestSize.Level1) +{ + RefPtr clickRecognizer = AceType::MakeRefPtr(FINGER_NUMBER, COUNT); + RefPtr targetComponent = AceType::MakeRefPtr(); + clickRecognizer->inputEventType_ = InputEventType::KEYBOARD; + clickRecognizer->deviceId_ = 1; + + auto func = [](const std::shared_ptr& info, const RefPtr& current, + const std::list>& others) { + EXPECT_EQ(info->rawInputEventType_, InputEventType::KEYBOARD); + EXPECT_EQ(info->rawInputDeviceId_, 1); + return GestureJudgeResult::REJECT; + }; + TouchEvent touchEvent; + touchEvent.rollAngle = 0; + clickRecognizer->touchPoints_[0] = touchEvent; + clickRecognizer->targetComponent_ = targetComponent; + targetComponent->SetOnGestureRecognizerJudgeBegin(func); + clickRecognizer->TriggerGestureJudgeCallback(); +} } // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/test/unittest/core/gestures/long_press_recognizer_test_ng.cpp b/test/unittest/core/gestures/long_press_recognizer_test_ng.cpp index 3e82af4817d..9780a7491c6 100644 --- a/test/unittest/core/gestures/long_press_recognizer_test_ng.cpp +++ b/test/unittest/core/gestures/long_press_recognizer_test_ng.cpp @@ -2094,4 +2094,33 @@ HWTEST_F(LongPressRecognizerTestNg, LongPressRecognizerTypeTest001, TestSize.Lev longPressRecognizer->HandleReports(info, GestureCallbackType::END); EXPECT_EQ(longPressRecognizer->GetRecognizerType(), GestureTypeName::LONG_PRESS_GESTURE); } + +/** + * @tc.name: TriggerGestureJudgeCallbackTest002 + * @tc.desc: Test TriggerGestureJudgeCallback + * @tc.type: FUNC + */ +HWTEST_F(LongPressRecognizerTestNg, TriggerGestureJudgeCallbackTest002, TestSize.Level1) +{ + RefPtr longPressRecognizer = + AceType::MakeRefPtr(LONG_PRESS_DURATION, FINGER_NUMBER, false); + RefPtr targetComponent = AceType::MakeRefPtr(); + longPressRecognizer->inputEventType_ = InputEventType::KEYBOARD; + longPressRecognizer->deviceId_ = 1; + longPressRecognizer->lastAction_ = 1; + + auto func = [](const std::shared_ptr& info, const RefPtr& current, + const std::list>& others) { + EXPECT_EQ(info->rawInputEventType_, InputEventType::KEYBOARD); + EXPECT_EQ(info->rawInputDeviceId_, 1); + EXPECT_EQ(info->lastAction_.value_or(0), 1); + return GestureJudgeResult::REJECT; + }; + TouchEvent touchEvent; + touchEvent.rollAngle = 0; + longPressRecognizer->touchPoints_[0] = touchEvent; + longPressRecognizer->targetComponent_ = targetComponent; + targetComponent->SetOnGestureRecognizerJudgeBegin(func); + longPressRecognizer->TriggerGestureJudgeCallback(); +} } // namespace OHOS::Ace::NG \ No newline at end of file -- Gitee