Skip to content

Commit 3bb2f8d

Browse files
authored
Merge pull request #12 from willian-feng/sig
feat: [issues: #11]MapView添加onRegionChangeComplete事件
2 parents 1ebc342 + a0cb2c6 commit 3bb2f8d

File tree

5 files changed

+66
-22
lines changed

5 files changed

+66
-22
lines changed

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

+13
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@ namespace react {
5656
});
5757
}
5858

59+
void AIRMapEventEmitter::onRegionChangeComplete(onRegionEvent event) const {
60+
dispatchEvent("regionChangeComplete", [event = std::move(event)](jsi::Runtime &runtime) {
61+
auto region = jsi::Object(runtime);
62+
region.setProperty(runtime, "latitude", event.region.latitude);
63+
region.setProperty(runtime, "longitude", event.region.longitude);
64+
region.setProperty(runtime, "latitudeDelta", event.region.latitudeDelta);
65+
region.setProperty(runtime, "longitudeDelta", event.region.longitudeDelta);
66+
auto payload = jsi::Object(runtime);
67+
payload.setProperty(runtime, "region", region);
68+
return payload;
69+
});
70+
}
71+
5972
void AIRMapEventEmitter::onMarkerPress(onPressEvent event) const {
6073
dispatchEvent("markerPress", [event = std::move(event)](jsi::Runtime &runtime) {
6174
auto coordinate = jsi::Object(runtime);

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

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class JSI_EXPORT AIRMapEventEmitter : public ViewEventEmitter {
5555
void onPress(onPressEvent event) const;
5656
void onLongPress(onLongPressEvent event) const;
5757
void onRegionChange(onRegionEvent event) const;
58+
void onRegionChangeComplete(onRegionEvent event) const;
5859

5960
void onMarkerPress(onPressEvent event) const;
6061
void onMarkerDragStart(onPressEvent event) const;

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

+23-9
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ namespace rnoh {
3535
MAP_PRESS = 1,
3636
MAP_LONG_PRESS = 2,
3737
MAP_REGION_CHANGE = 3,
38-
MAP_MARKER_PRESS = 4,
39-
MAP_MARKER_DRAG = 5,
40-
MAP_MARKER_DRAG_START = 6,
41-
MAP_MARKER_DRAG_END = 7,
42-
MAP_POI = 8,
38+
MAP_REGION_CHANGE_COMPLETE = 4,
39+
MAP_MARKER_PRESS = 5,
40+
MAP_MARKER_DRAG = 6,
41+
MAP_MARKER_DRAG_START = 7,
42+
MAP_MARKER_DRAG_END = 8,
43+
MAP_POI = 9,
4344
};
4445

4546
AIRMapEventType getAIRMapEventType(ArkJS &arkJs, napi_value eventObject) {
@@ -52,6 +53,8 @@ namespace rnoh {
5253
return AIRMapEventType::MAP_LONG_PRESS;
5354
} else if (eventType == "onRegionChange") {
5455
return AIRMapEventType::MAP_REGION_CHANGE;
56+
} else if (eventType == "onRegionChangeComplete") {
57+
return AIRMapEventType::MAP_REGION_CHANGE_COMPLETE;
5558
} else if (eventType == "onMarkerPress") {
5659
return AIRMapEventType::MAP_MARKER_PRESS;
5760
} else if (eventType == "onMarkerDrag") {
@@ -115,6 +118,17 @@ class AIRMapEventEmitRequestHandler : public EventEmitRequestHandler {
115118
react::AIRMapEventEmitter::onRegionEvent event{region};
116119
eventEmitter->onRegionChange(event);
117120
} break;
121+
case AIRMapEventType::MAP_REGION_CHANGE_COMPLETE: {
122+
auto _region = arkJs.getObjectProperty(ctx.payload, "region");
123+
facebook::react::Region region = {
124+
(float)arkJs.getDouble(arkJs.getObjectProperty(_region, "latitude")),
125+
(float)arkJs.getDouble(arkJs.getObjectProperty(_region, "longitude")),
126+
(float)arkJs.getDouble(arkJs.getObjectProperty(_region, "longitudeDelta")),
127+
(float)arkJs.getDouble(arkJs.getObjectProperty(_region, "longitudeDelta"))
128+
};
129+
react::AIRMapEventEmitter::onRegionEvent event{region};
130+
eventEmitter->onRegionChangeComplete(event);
131+
} break;
118132
case AIRMapEventType::MAP_MARKER_PRESS: {
119133
auto _coordinate = arkJs.getObjectProperty(ctx.payload, "coordinate");
120134
facebook::react::Coordinate coordinate = {
@@ -123,31 +137,31 @@ class AIRMapEventEmitRequestHandler : public EventEmitRequestHandler {
123137
react::AIRMapEventEmitter::onPressEvent event{coordinate};
124138
eventEmitter->onMarkerPress(event);
125139
} break;
126-
case AIRMapEventType::MAP_MARKER_DRAG: {
140+
case AIRMapEventType::MAP_MARKER_DRAG: {
127141
auto _coordinate = arkJs.getObjectProperty(ctx.payload, "coordinate");
128142
facebook::react::Coordinate coordinate = {
129143
(float)arkJs.getDouble(arkJs.getObjectProperty(_coordinate, "latitude")),
130144
(float)arkJs.getDouble(arkJs.getObjectProperty(_coordinate, "longitude"))};
131145
react::AIRMapEventEmitter::onPressEvent event{coordinate};
132146
eventEmitter->onMarkerDrag(event);
133147
} break;
134-
case AIRMapEventType::MAP_MARKER_DRAG_START: {
148+
case AIRMapEventType::MAP_MARKER_DRAG_START: {
135149
auto _coordinate = arkJs.getObjectProperty(ctx.payload, "coordinate");
136150
facebook::react::Coordinate coordinate = {
137151
(float)arkJs.getDouble(arkJs.getObjectProperty(_coordinate, "latitude")),
138152
(float)arkJs.getDouble(arkJs.getObjectProperty(_coordinate, "longitude"))};
139153
react::AIRMapEventEmitter::onPressEvent event{coordinate};
140154
eventEmitter->onMarkerDragStart(event);
141155
} break;
142-
case AIRMapEventType::MAP_MARKER_DRAG_END: {
156+
case AIRMapEventType::MAP_MARKER_DRAG_END: {
143157
auto _coordinate = arkJs.getObjectProperty(ctx.payload, "coordinate");
144158
facebook::react::Coordinate coordinate = {
145159
(float)arkJs.getDouble(arkJs.getObjectProperty(_coordinate, "latitude")),
146160
(float)arkJs.getDouble(arkJs.getObjectProperty(_coordinate, "longitude"))};
147161
react::AIRMapEventEmitter::onPressEvent event{coordinate};
148162
eventEmitter->onMarkerDragEnd(event);
149163
} break;
150-
case AIRMapEventType::MAP_POI: {
164+
case AIRMapEventType::MAP_POI: {
151165
auto _coordinate = arkJs.getObjectProperty(ctx.payload, "coordinate");
152166
facebook::react::Coordinate coordinate = {
153167
(float)arkJs.getDouble(arkJs.getObjectProperty(_coordinate, "latitude")),

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

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ namespace rnoh {
6363
events.setProperty(rt, "topPress", createDirectEvent(rt, "onPress"));
6464
events.setProperty(rt, "topLongPress", createDirectEvent(rt, "onLongPress"));
6565
events.setProperty(rt, "topRegionChange", createDirectEvent(rt, "onRegionChange"));
66+
events.setProperty(rt, "topRegionChangeComplete", createDirectEvent(rt, "onRegionChangeComplete"));
6667
events.setProperty(rt, "topMarkerPress", createDirectEvent(rt, "onMarkerPress"));
6768
events.setProperty(rt, "topMarkerDrag", createDirectEvent(rt, "onMarkerDrag"));
6869
events.setProperty(rt, "topMarkerDragStart", createDirectEvent(rt, "onMarkerDragStart"));

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

+28-13
Original file line numberDiff line numberDiff line change
@@ -142,40 +142,55 @@ export struct AIRMap {
142142
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onMapReady" });
143143
});
144144
this.mapController.on("mapClick", (latLng) => {
145-
LWLog('AIRMap.aboutToAppear.callback.mapClick', JSON.stringify(latLng));
145+
LWLog('AIRMap.aboutToAppear.callback.mapClick', JSON.stringify(latLng));
146146
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onPress", coordinate: latLng });
147147
});
148148
this.mapController.on("mapLongClick", (latLng) => {
149-
LWLog('AIRMap.aboutToAppear.callback.mapLongClick');
149+
LWLog('AIRMap.aboutToAppear.callback.mapLongClick');
150150
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onLongPress", coordinate: latLng });
151151
});
152152
//marker
153153
this.mapController.on("markerClick", (marker) => {
154-
LWLog('AIRMap.aboutToAppear.callback.markerClick');
154+
LWLog('AIRMap.aboutToAppear.callback.markerClick');
155155
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onMarkerPress", coordinate: marker.getPosition() });
156156
});
157157
this.mapController.on("markerDrag", (marker) => {
158158
LWLog('AIRMap.aboutToAppear.callback.markerDrag');
159159
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onMarkerDrag", coordinate: marker.getPosition() });
160160
});
161161
this.mapController.on("markerDragEnd", (marker) => {
162-
LWLog('AIRMap.aboutToAppear.callback.markerDragEnd');
162+
LWLog('AIRMap.aboutToAppear.callback.markerDragEnd');
163163
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onMarkerDragEnd", coordinate: marker.getPosition() });
164164
});
165165
this.mapController.on("markerDragStart", (marker) => {
166-
LWLog('AIRMap.aboutToAppear.callback.markerDragStart');
166+
LWLog('AIRMap.aboutToAppear.callback.markerDragStart');
167167
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onMarkerDragStart", coordinate: marker.getPosition() });
168168
});
169169

170170
this.mapController.on("cameraChange", (latLng) => {
171-
LWLog('AIRMap.aboutToAppear.callback.cameraChange', JSON.stringify(latLng));
172-
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, { type: "onRegionChange",
173-
region: {
174-
latitude: latLng.latitude,
175-
longitude: latLng.longitude,
176-
latitudeDelta: 0,
177-
longitudeDelta: 0
178-
}
171+
LWLog('AIRMap.aboutToAppear.callback.cameraChange', JSON.stringify(latLng));
172+
const projection: map.Projection | undefined = this.mapController?.getProjection();
173+
const visibleRegion: mapCommon.VisibleRegion | undefined = projection?.getVisibleRegion();
174+
const bounds = visibleRegion?.bounds;
175+
let latitudeDelta = 0;
176+
let longitudeDelta = 0;
177+
if (bounds) {
178+
latitudeDelta = bounds.northeast.latitude - bounds.southwest.latitude;
179+
longitudeDelta = bounds.northeast.longitude - bounds.southwest.longitude;
180+
}
181+
const region: Region = {
182+
latitude: latLng.latitude,
183+
longitude: latLng.longitude,
184+
latitudeDelta,
185+
longitudeDelta
186+
}
187+
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, {
188+
type: "onRegionChange",
189+
region
190+
});
191+
this.ctx.rnInstance.emitComponentEvent(this.descriptor.tag, AIR_MAP_TYPE, {
192+
type: "onRegionChangeComplete",
193+
region
179194
});
180195
});
181196
this.mapController.on("cameraMove", () => {

0 commit comments

Comments
 (0)