diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets index e738299052d4c7869e27227ea83a452b53334b0b..5bf0f60f64c0fae0e486163cbce5aef9b9c79e7d 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/FlutterNapi.ets @@ -30,6 +30,7 @@ import FlutterManager from '../ohos/FlutterManager'; import deviceInfo from '@ohos.deviceInfo'; import TouchEventProcessor from '../ohos/TouchEventProcessor'; import { EmbeddingNodeController } from '../ohos/EmbeddingNodeController'; +import { CustomTouchEvent } from '../../plugin/platform/CustomTouchEvent'; const TAG = "FlutterNapi"; @@ -404,17 +405,33 @@ export default class FlutterNapi { /** Dispatch Touch Event */ onTouchEvent(strings: Array): void { - Log.d(TAG, "called onTouchEvent "); FlutterManager.getInstance().getFlutterViewList().forEach((value) => { - let length = value.getDVModel().children.length; + let length = value.getDVModel().children.length for (let index = length - 1; index >= 0; index--) { - let dvModel = value.getDVModel().children[index]; - let params = dvModel.getLayoutParams(); - let params2 = params as Record; - let nodeController = params2['nodeController'] as EmbeddingNodeController; - let left = params2['left'] as number ?? 0; - let top = params2['top'] as number ?? 0; - nodeController.postEvent(TouchEventProcessor.getInstance().constureCustomTouchEvent(strings, top, left)); + let dvModel = value.getDVModel().children[index] + let params = dvModel.getLayoutParams() as Record; + let left = params['left'] as number ?? 0; + let top = params['top'] as number ?? 0; + let down = params['down'] as boolean ?? false; + if (down) { + //如果flutter端判断当前platformView是可点击的,则将事件分发出去 + let touchEvent = TouchEventProcessor.getInstance().constureCustomTouchEvent(strings, top, left); + let nodeController = params['nodeController'] as EmbeddingNodeController; + nodeController.postEvent(touchEvent) + } else if (strings[6] == '0' && !down) { + //如果触摸事件为OH_NATIVEXCOMPONENT_DOWN=0类型,且在flutter端还没判断当前view是否处于点击区域内,则 + //将点击事件存储在list列表中。 + let touchEvent = TouchEventProcessor.getInstance().constureCustomTouchEvent(strings, top, left); + let array: Array | undefined = params['touchEvent'] as Array + if (array == undefined) { + array = [] + params['touchEvent'] = array + } + array.push(touchEvent) + } else if (strings[0] == '1' && strings[6] == '1') { + //如果当前触控手指的个数为1个,且当前点击类型为OH_NATIVEXCOMPONENT_UP,则清空列表数据 + params['touchEvent'] = undefined + } } }); } diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/platform/PlatformViewsController.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/platform/PlatformViewsController.ets index 78021254ccf0d5fe809df7adf8dd436212dc7389..27c59234a5246d3ad8c335d8bf8cacf9df49f8c2 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/platform/PlatformViewsController.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/plugin/platform/PlatformViewsController.ets @@ -190,8 +190,31 @@ export default class PlatformViewsController implements PlatformViewsAccessibili } onTouch(touch: PlatformViewTouch): void { - console.log("nodeController onTouch:do nothing") - // do nothing + let viewWrapper: undefined | PlatformViewWrapper = this.viewWrappers.get(touch.viewId) + if (viewWrapper != undefined) { + let dvModel = viewWrapper.getDvModel() + let params = dvModel.getLayoutParams() as Record; + //接收到点击类型为down的时候 + if (touch.action == 0) { + //将当前点击状态设置为true + params['down'] = true + //首次收到触控点击类型为 OH_NATIVEXCOMPONENT_DOWN ,则将存到列表中的事件分发出去 + let touchEventArray: Array | undefined = params['touchEvent'] as Array + if (touchEventArray != undefined) { + let nodeController = params['nodeController'] as EmbeddingNodeController; + for (let it of touchEventArray) { + nodeController.postEvent(it) + } + //首次执行完之后,将列表数据置空 + params['touchEvent'] = undefined + } + //当前接收的事件类型为up的时候 + } else if (touch.action == 1) { + //手指抬起之后,将当前点击状态设置为false。测试了一下,多个手指突然抬起,最后返回的状态也是1 + //所以,这边就以状态抬起,代表当前用户不点击platformview了 + params['down'] = false + } + } } setDirection(viewId: number, direction: Direction): void {