Skip to content

Commit 7e04aa4

Browse files
authored
feat: polyline、polygon、circle添加点击事件 (#22)
1 parent 7fc5d1b commit 7e04aa4

9 files changed

+200
-14
lines changed

harmony/maps/src/main/cpp/EventEmitters.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,30 @@ namespace react {
167167
});
168168
}
169169

170+
//------------------------AIRMapPolygon------------------------------
171+
void AIRMapPolygonEventEmitter::onPress(onPressEvent event) const {
172+
dispatchEvent("press", [event = std::move(event)](jsi::Runtime &runtime) {
173+
auto payload = jsi::Object(runtime);
174+
return payload;
175+
});
176+
}
177+
178+
//------------------------AIRMapPolyline------------------------------
179+
void AIRMapPolylineEventEmitter::onPress(onPressEvent event) const {
180+
dispatchEvent("press", [event = std::move(event)](jsi::Runtime &runtime) {
181+
auto payload = jsi::Object(runtime);
182+
return payload;
183+
});
184+
}
185+
186+
//------------------------AIRMapCircle------------------------------
187+
void AIRMapCircleEventEmitter::onPress(onPressEvent event) const {
188+
dispatchEvent("press", [event = std::move(event)](jsi::Runtime &runtime) {
189+
auto payload = jsi::Object(runtime);
190+
return payload;
191+
});
192+
}
193+
170194
//------------------------AIRMapCallout------------------------------
171195
void AIRMapCalloutEventEmitter::onPress(onPressEvent event) const {
172196
dispatchEvent("press", [event = std::move(event)](jsi::Runtime &runtime) {

harmony/maps/src/main/cpp/EventEmitters.h

+12
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,28 @@ class JSI_EXPORT AIRMapMarkerEventEmitter : public ViewEventEmitter {
9090
class JSI_EXPORT AIRMapPolylineEventEmitter : public ViewEventEmitter {
9191
public:
9292
using ViewEventEmitter::ViewEventEmitter;
93+
94+
struct onPressEvent {};
95+
96+
void onPress(onPressEvent event) const;
9397
};
9498

9599
class JSI_EXPORT AIRMapPolygonEventEmitter : public ViewEventEmitter {
96100
public:
97101
using ViewEventEmitter::ViewEventEmitter;
102+
103+
struct onPressEvent {};
104+
105+
void onPress(onPressEvent event) const;
98106
};
99107

100108
class JSI_EXPORT AIRMapCircleEventEmitter : public ViewEventEmitter {
101109
public:
102110
using ViewEventEmitter::ViewEventEmitter;
111+
112+
struct onPressEvent {};
113+
114+
void onPress(onPressEvent event) const;
103115
};
104116

105117
class JSI_EXPORT AIRMapCalloutEventEmitter : public ViewEventEmitter {

harmony/maps/src/main/cpp/MapsEventEmitRequestHandler.h

+109
Original file line numberDiff line numberDiff line change
@@ -322,4 +322,113 @@ class AIRMapCalloutSubviewEventEmitRequestHandler : public EventEmitRequestHandl
322322
}
323323
};
324324
};
325+
326+
enum AIRMapPolygonEventType {
327+
POLYGON_PRESS = 0,
328+
};
329+
330+
AIRMapPolygonEventType getAIRMapPolygonEventType(ArkJS &arkJs, napi_value eventObject) {
331+
auto eventType = arkJs.getString(arkJs.getObjectProperty(eventObject, "type"));
332+
if (eventType == "onPress") {
333+
return AIRMapPolygonEventType::POLYGON_PRESS;
334+
} else {
335+
throw std::runtime_error("Unknown Page event type");
336+
}
337+
}
338+
339+
class AIRMapPolygonEventEmitRequestHandler : public EventEmitRequestHandler {
340+
public:
341+
void handleEvent(EventEmitRequestHandler::Context const &ctx) override {
342+
if (ctx.eventName != "AIRMapPolygon") {
343+
return;
344+
}
345+
ArkJS arkJs(ctx.env);
346+
auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter<react::AIRMapPolygonEventEmitter>(ctx.tag);
347+
if (eventEmitter == nullptr) {
348+
return;
349+
}
350+
switch (getAIRMapPolygonEventType(arkJs, ctx.payload)) {
351+
case AIRMapPolygonEventType::POLYGON_PRESS: {
352+
react::AIRMapPolygonEventEmitter::onPressEvent event{};
353+
eventEmitter->onPress(event);
354+
}
355+
break;
356+
default:
357+
break;
358+
}
359+
};
360+
};
361+
362+
enum AIRMapPolylineEventType {
363+
POLYLINE_PRESS = 0,
364+
};
365+
366+
AIRMapPolylineEventType getAIRMapPolylineEventType(ArkJS &arkJs, napi_value eventObject) {
367+
auto eventType = arkJs.getString(arkJs.getObjectProperty(eventObject, "type"));
368+
if (eventType == "onPress") {
369+
return AIRMapPolylineEventType::POLYLINE_PRESS;
370+
} else {
371+
throw std::runtime_error("Unknown Page event type");
372+
}
373+
}
374+
375+
class AIRMapPolylineEventEmitRequestHandler : public EventEmitRequestHandler {
376+
public:
377+
void handleEvent(EventEmitRequestHandler::Context const &ctx) override {
378+
if (ctx.eventName != "AIRMapPolyline") {
379+
return;
380+
}
381+
ArkJS arkJs(ctx.env);
382+
auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter<react::AIRMapPolylineEventEmitter>(ctx.tag);
383+
if (eventEmitter == nullptr) {
384+
return;
385+
}
386+
switch (getAIRMapPolylineEventType(arkJs, ctx.payload)) {
387+
case AIRMapPolylineEventType::POLYLINE_PRESS: {
388+
react::AIRMapPolylineEventEmitter::onPressEvent event{};
389+
eventEmitter->onPress(event);
390+
}
391+
break;
392+
default:
393+
break;
394+
}
395+
};
396+
};
397+
398+
enum AIRMapCircleEventType {
399+
CIRCLE_PRESS = 0,
400+
};
401+
402+
AIRMapCircleEventType getAIRMapCircleEventType(ArkJS &arkJs, napi_value eventObject) {
403+
auto eventType = arkJs.getString(arkJs.getObjectProperty(eventObject, "type"));
404+
if (eventType == "onPress") {
405+
return AIRMapCircleEventType::CIRCLE_PRESS;
406+
} else {
407+
throw std::runtime_error("Unknown Page event type");
408+
}
409+
}
410+
411+
class AIRMapCircleEventEmitRequestHandler : public EventEmitRequestHandler {
412+
public:
413+
void handleEvent(EventEmitRequestHandler::Context const &ctx) override {
414+
if (ctx.eventName != "AIRMapCircle") {
415+
return;
416+
}
417+
ArkJS arkJs(ctx.env);
418+
auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter<react::AIRMapCircleEventEmitter>(ctx.tag);
419+
if (eventEmitter == nullptr) {
420+
return;
421+
}
422+
switch (getAIRMapCircleEventType(arkJs, ctx.payload)) {
423+
case AIRMapCircleEventType::CIRCLE_PRESS: {
424+
react::AIRMapCircleEventEmitter::onPressEvent event{};
425+
eventEmitter->onPress(event);
426+
}
427+
break;
428+
default:
429+
break;
430+
}
431+
};
432+
};
433+
325434
} // namespace rnoh

harmony/maps/src/main/cpp/MapsJSIBinder.h

+18
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ namespace rnoh {
115115
object.setProperty(rt, "lineCap", "string");
116116
return object;
117117
}
118+
119+
facebook::jsi::Object createDirectEventTypes(facebook::jsi::Runtime &rt) override {
120+
facebook::jsi::Object events(rt);
121+
events.setProperty(rt, "topPress", createDirectEvent(rt, "onPress"));
122+
return events;
123+
}
118124
};
119125

120126
class AIRMapPolygonJSIBinder : public ViewComponentJSIBinder {
@@ -133,6 +139,12 @@ namespace rnoh {
133139
object.setProperty(rt, "lineCap", "string");
134140
return object;
135141
}
142+
143+
facebook::jsi::Object createDirectEventTypes(facebook::jsi::Runtime &rt) override {
144+
facebook::jsi::Object events(rt);
145+
events.setProperty(rt, "topPress", createDirectEvent(rt, "onPress"));
146+
return events;
147+
}
136148
};
137149

138150
class AIRMapCircleJSIBinder : public ViewComponentJSIBinder {
@@ -147,6 +159,12 @@ namespace rnoh {
147159
object.setProperty(rt, "lineDashPattern", "array");
148160
return object;
149161
}
162+
163+
facebook::jsi::Object createDirectEventTypes(facebook::jsi::Runtime &rt) override {
164+
facebook::jsi::Object events(rt);
165+
events.setProperty(rt, "topPress", createDirectEvent(rt, "onPress"));
166+
return events;
167+
}
150168
};
151169

152170
class AIRMapCalloutJSIBinder : public ViewComponentJSIBinder {

harmony/maps/src/main/cpp/MapsPackage.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "MapsJSIBinder.h"
44
#include "MapsEventEmitRequestHandler.h"
55
#include "AIRMapManagerTurboModule.h"
6+
#include "AIRMapMarkerManagerTurboModule.h"
67

78
using namespace rnoh;
89
using namespace facebook;
@@ -13,7 +14,7 @@ class MapsTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate {
1314
if (name == "AIRMapManager") {
1415
return std::make_shared<AIRMapManagerTurboModule>(ctx, name);
1516
} else if (name == "AIRMapMarkerManager") {
16-
return std::make_shared<AIRMapManagerTurboModule>(ctx, name);
17+
return std::make_shared<AIRMapMarkerManagerTurboModule>(ctx, name);
1718
}
1819
return nullptr;
1920
};
@@ -71,6 +72,9 @@ namespace rnoh {
7172
EventEmitRequestHandlers createEventEmitRequestHandlers() override {
7273
return {std::make_shared<AIRMapEventEmitRequestHandler>(),
7374
std::make_shared<AIRMapMarkerEventEmitRequestHandler>(),
75+
std::make_shared<AIRMapPolygonEventEmitRequestHandler>(),
76+
std::make_shared<AIRMapPolylineEventEmitRequestHandler>(),
77+
std::make_shared<AIRMapCircleEventEmitRequestHandler>(),
7478
std::make_shared<AIRMapCalloutEventEmitRequestHandler>(),
7579
std::make_shared<AIRMapCalloutSubviewEventEmitRequestHandler>()};
7680
};

harmony/maps/src/main/ets/AIRMaps/AIRMapCircle.ets

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export struct AIRMapCircle {
6565
}
6666

6767
setInstance() {
68-
MapsManager.getInstance().addCircle(this.descriptor)?.then(instance => {
68+
MapsManager.getInstance().addCircle(this.descriptor, this.ctx)?.then(instance => {
6969
this.instance = instance;
7070
});
7171
}

harmony/maps/src/main/ets/AIRMaps/AIRMapPolygon.ets

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export struct AIRMapPolygon {
6666
}
6767

6868
setInstance() {
69-
MapsManager.getInstance().addPolygon(this.descriptor)?.then(instance => {
69+
MapsManager.getInstance().addPolygon(this.descriptor, this.ctx)?.then(instance => {
7070
this.instance = instance;
7171
});
7272
}

harmony/maps/src/main/ets/AIRMaps/AIRMapPolyline.ets

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export struct AIRMapPolyline {
6969
}
7070

7171
setInstance() {
72-
MapsManager.getInstance().addPolyline(this.descriptor)?.then(instance => {
72+
MapsManager.getInstance().addPolyline(this.descriptor, this.ctx)?.then(instance => {
7373
this.instance = instance;
7474
});
7575
}

harmony/maps/src/main/ets/MapsManager.ets

+29-10
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
*/
2222

2323
import { map, mapCommon, site } from '@kit.MapKit';
24+
import { RNComponentContext } from '@rnoh/react-native-openharmony';
2425
import { AIRMapCallout, AIR_MAP_CALLOUT_TYPE } from './AIRMaps/AIRMapCallout';
26+
import { AIR_MAP_CIRCLE_TYPE } from './AIRMaps/AIRMapCircle';
2527
import { AIRMapMarkerDescriptor,
2628
AIRMapPolylineDescriptor,
2729
AIRMapPolygonDescriptor,
@@ -34,6 +36,8 @@ import { AIRMapMarkerDescriptor,
3436
AIRMapOverlayDescriptor
3537
} from './AIRMaps/AIRMapDescriptorTypes';
3638
import { AIRMapMarker, AIR_MAP_MARKER_TYPE } from './AIRMaps/AIRMapMarker';
39+
import { AIR_MAP_POLYGON_TYPE } from './AIRMaps/AIRMapPolygon';
40+
import { AIR_MAP_POLYLINE_TYPE } from './AIRMaps/AIRMapPolyline';
3741
import { LWError, LWLog } from './LWLog';
3842
import { MapsTurboManager } from './MapsTurboManager';
3943
import {
@@ -57,17 +61,22 @@ export class MapsManager{
5761

5862
private mapController?: map.MapComponentController;
5963
private initMapController = false;
64+
private eventNodeMap: Map<string, number> = new Map();
6065

6166
initMapComponentController(controller?: map.MapComponentController){
6267
LWLog('MapsManager.initMapComponentController----->controller=' + controller)
6368
if (!controller) {
6469
//释放controller
6570
if (this.mapController) {
71+
this.eventNodeMap.clear();
6672
this.mapController?.off('markerClick', ()=>{});
6773
this.mapController?.off('markerDragStart', ()=>{});
6874
this.mapController?.off('markerDrag', ()=>{});
6975
this.mapController?.off('markerDragEnd', ()=>{});
7076
this.mapController?.off('infoWindowClick', ()=>{});
77+
this.mapController?.off('polylineClick', ()=>{});
78+
this.mapController?.off('polygonClick', ()=>{});
79+
this.mapController?.off('circleClick', ()=>{});
7180
}
7281
}
7382
this.mapController = controller;
@@ -113,27 +122,27 @@ export class MapsManager{
113122
};
114123
return this.mapController.addMarker(markerOptions).then(marker => {
115124
LWLog('MapsManager.addMarker----------marker=' + marker.getId())
116-
125+
this.eventNodeMap.set(marker.getId(), desc.tag);
117126
this.mapController?.on("markerClick", (marker)=>{
118-
_this.ctx.rnInstance.emitComponentEvent(_this.descriptor.tag, AIR_MAP_MARKER_TYPE, { type: "onPress" });
127+
_this.ctx.rnInstance.emitComponentEvent(this.eventNodeMap.get(marker.getId()), AIR_MAP_MARKER_TYPE, { type: "onPress" });
119128
if (marker.getTitle()) {
120129
marker.setInfoWindowVisible(!marker.isInfoWindowVisible());
121130
}
122131
})
123132
this.mapController?.on("markerDragStart", (marker)=>{
124-
_this.ctx.rnInstance.emitComponentEvent(_this.descriptor.tag, AIR_MAP_MARKER_TYPE, { type: "onDragStart", coordinate: marker.getPosition() });
133+
_this.ctx.rnInstance.emitComponentEvent(this.eventNodeMap.get(marker.getId()), AIR_MAP_MARKER_TYPE, { type: "onDragStart", coordinate: marker.getPosition() });
125134
})
126135
this.mapController?.on("markerDrag", (marker)=>{
127-
_this.ctx.rnInstance.emitComponentEvent(_this.descriptor.tag, AIR_MAP_MARKER_TYPE, { type: "onDrag", coordinate: marker.getPosition() });
136+
_this.ctx.rnInstance.emitComponentEvent(this.eventNodeMap.get(marker.getId()), AIR_MAP_MARKER_TYPE, { type: "onDrag", coordinate: marker.getPosition() });
128137
})
129138
this.mapController?.on("markerDragEnd", (marker)=>{
130-
_this.ctx.rnInstance.emitComponentEvent(_this.descriptor.tag, AIR_MAP_MARKER_TYPE, { type: "onDragEnd", coordinate: marker.getPosition() });
139+
_this.ctx.rnInstance.emitComponentEvent(this.eventNodeMap.get(marker.getId()), AIR_MAP_MARKER_TYPE, { type: "onDragEnd", coordinate: marker.getPosition() });
131140
})
132141
return marker;
133142
});
134143
}
135144

136-
addPolyline(desc: AIRMapPolylineDescriptor){
145+
addPolyline(desc: AIRMapPolylineDescriptor, ctx: RNComponentContext){
137146
LWLog('MapsManager.addPolyline----------rawProps=【' + JSON.stringify(desc.rawProps) + '】')
138147
if (!this.mapController) {
139148
LWError('addPolyline error, mapController is undefined!')
@@ -157,12 +166,15 @@ export class MapsManager{
157166
// 创建polyline
158167
return this.mapController.addPolyline(polylineOption).then(mapPolyline=>{
159168
LWLog('MapsManager.addPolyline----------polyline=' + mapPolyline)
169+
this.eventNodeMap.set(mapPolyline.getId(), desc.tag);
170+
this.mapController?.on("polylineClick", (polyline) => {
171+
ctx.rnInstance.emitComponentEvent(this.eventNodeMap.get(polyline.getId()), AIR_MAP_POLYLINE_TYPE, { type: "onPress" });
172+
})
160173
return mapPolyline;
161174
});
162-
163175
}
164176

165-
addPolygon(desc: AIRMapPolygonDescriptor){
177+
addPolygon(desc: AIRMapPolygonDescriptor, ctx: RNComponentContext){
166178
LWLog('MapsManager.addPolygon----------rawProps=【' + JSON.stringify(desc.rawProps) + '】')
167179
if (!this.mapController) {
168180
LWError('addPolygon error, mapController is undefined!')
@@ -184,12 +196,15 @@ export class MapsManager{
184196
// 创建多边形
185197
return this.mapController.addPolygon(polygonOptions).then(mapPolygon=>{
186198
LWLog('MapsManager.addPolygon----------polygon=' + mapPolygon)
199+
this.eventNodeMap.set(mapPolygon.getId(), desc.tag);
200+
this.mapController?.on("polygonClick", (polygon) => {
201+
ctx.rnInstance.emitComponentEvent(this.eventNodeMap.get(polygon.getId()), AIR_MAP_POLYGON_TYPE, { type: "onPress" });
202+
})
187203
return mapPolygon;
188204
});
189-
190205
}
191206

192-
addCircle(desc: AIRMapCircleDescriptor){
207+
addCircle(desc: AIRMapCircleDescriptor, ctx: RNComponentContext){
193208
LWLog('MapsManager.addCircle----------rawProps=【' + JSON.stringify(desc.rawProps) + '】')
194209
if (!this.mapController) {
195210
LWError('addCircle error, mapController is undefined!')
@@ -212,6 +227,10 @@ export class MapsManager{
212227
// 创建Circle
213228
return this.mapController.addCircle(mapCircleOptions).then(mapCircle=>{
214229
LWLog('MapsManager.addCircle----------circle=' + JSON.stringify(mapCircle));
230+
this.eventNodeMap.set(mapCircle.getId(), desc.tag);
231+
this.mapController?.on("circleClick", (circle) => {
232+
ctx.rnInstance.emitComponentEvent(this.eventNodeMap.get(circle.getId()), AIR_MAP_CIRCLE_TYPE, { type: "onPress" });
233+
})
215234
return mapCircle;
216235
});
217236
}

0 commit comments

Comments
 (0)