[NDK] fix node from GestureEvent

Signed-off-by:lisitaolisitao3@huawei.com

Signed-off-by: lisitao <lisitao3@huawei.com>
Change-Id: I16b50bd5d8d4da69818e50f227631837f9248091
This commit is contained in:
lisitao 2024-07-01 10:43:40 +00:00
parent da11411d34
commit 42a959cd4a
3 changed files with 29 additions and 10 deletions

View File

@ -2494,11 +2494,18 @@ struct ArkUITabsControllerModifier {
struct ArkUIGesture;
struct ArkUIGestureEvent {
ArkUIAPIEventGestureAsyncEvent eventData;
void* attachNode;
};
struct ArkUIGestureInterruptInfo {
bool isSystemGesture;
ArkUI_Int32 systemRecognizerType;
ArkUIAPIEventGestureAsyncEvent* event = nullptr;
void* userData = nullptr;
void* inputEvent = nullptr;
void* gestureEvent = nullptr;
};
struct ArkUIGestureModifier {

View File

@ -26,6 +26,8 @@
#include "core/components_ng/base/view_abstract.h"
#include "core/components_ng/base/view_abstract_model_ng.h"
#include "core/interfaces/arkoala/arkoala_api.h"
#include "interfaces/native/event/ui_input_event_impl.h"
#include "interfaces/native/ui_input_event.h"
namespace OHOS::Ace::NG {
namespace {
@ -400,19 +402,22 @@ void setGestureInterrupterToNode(
ArkUINodeHandle node, ArkUI_Int32 (*interrupter)(ArkUIGestureInterruptInfo* interrupterInfo))
{
auto* frameNode = reinterpret_cast<FrameNode*>(node);
auto onGestureJudgeBegin = [interrupter](
const RefPtr<NG::GestureInfo>& gestureInfo,
const std::shared_ptr<BaseGestureEvent>& info)-> GestureJudgeResult {
ArkUIAPIEventGestureAsyncEvent* gestureEvent = new ArkUIAPIEventGestureAsyncEvent();
auto onGestureJudgeBegin = [interrupter](const RefPtr<NG::GestureInfo>& gestureInfo,
const std::shared_ptr<BaseGestureEvent>& info) -> GestureJudgeResult {
ArkUIAPIEventGestureAsyncEvent gestureEvent;
ArkUITouchEvent rawInputEvent;
GetBaseGestureEvent(gestureEvent, rawInputEvent, info);
GetBaseGestureEvent(&gestureEvent, rawInputEvent, info);
ArkUIGestureInterruptInfo interruptInfo;
interruptInfo.isSystemGesture = gestureInfo->IsSystemGesture();
interruptInfo.systemRecognizerType = static_cast<ArkUI_Int32>(gestureInfo->GetType());
interruptInfo.event = gestureEvent;
interruptInfo.event = &gestureEvent;
interruptInfo.userData = gestureInfo->GetUserData();
ArkUI_UIInputEvent inputEvent { ARKUI_UIINPUTEVENT_TYPE_TOUCH, C_TOUCH_EVENT_ID,
&rawInputEvent };
ArkUIGestureEvent arkUIGestureEvent { gestureEvent, nullptr };
interruptInfo.inputEvent = &inputEvent;
interruptInfo.gestureEvent = &arkUIGestureEvent;
auto result = interrupter(&interruptInfo);
delete gestureEvent;
return static_cast<GestureJudgeResult>(result);
};
ViewAbstract::SetOnGestureJudgeBegin(frameNode, std::move(onGestureJudgeBegin));

View File

@ -21,6 +21,7 @@
#include "node_model.h"
#include "gesture_impl.h"
#include "base/utils/utils.h"
#include "core/gestures/gesture_event.h"
#include "frameworks/core/interfaces/arkoala/arkoala_api.h"
#include "interfaces/native/event/ui_input_event_impl.h"
@ -160,10 +161,16 @@ ArkUI_GestureRecognizer* OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI
ArkUI_GestureEvent* OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo* event)
{
ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent *>(event->interruptData.event);
ArkUI_UIInputEvent* uiEvent = new ArkUI_UIInputEvent{
ARKUI_UIINPUTEVENT_TYPE_TOUCH, C_TOUCH_EVENT_ID, gestureEvent->eventData.rawPointerEvent };
CHECK_NULL_RETURN(event, nullptr);
ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent*>(event->interruptData.gestureEvent);
CHECK_NULL_RETURN(gestureEvent, nullptr);
ArkUI_UIInputEvent* uiEvent = reinterpret_cast<ArkUI_UIInputEvent*>(event->interruptData.inputEvent);
gestureEvent->eventData.rawPointerEvent = uiEvent;
auto* gestureRecognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(event->interruptData.userData);
CHECK_NULL_RETURN(gestureRecognizer, nullptr);
gestureEvent->attachNode = gestureRecognizer->attachNode;
return gestureEvent;
}