expo-gaode-map 2.0.0-alpha.4 → 2.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,8 +6,6 @@ import android.graphics.Bitmap
|
|
|
6
6
|
import android.graphics.BitmapFactory
|
|
7
7
|
import android.graphics.Canvas
|
|
8
8
|
import android.graphics.Color
|
|
9
|
-
import android.graphics.Paint
|
|
10
|
-
import android.graphics.Path
|
|
11
9
|
import android.os.Handler
|
|
12
10
|
import android.os.Looper
|
|
13
11
|
import android.view.View
|
|
@@ -54,7 +52,8 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
|
|
|
54
52
|
override fun generateLayoutParams(lp: android.view.ViewGroup.LayoutParams?): LayoutParams {
|
|
55
53
|
return when (lp) {
|
|
56
54
|
is LayoutParams -> lp
|
|
57
|
-
is
|
|
55
|
+
is android.widget.FrameLayout.LayoutParams -> LayoutParams(lp.width, lp.height)
|
|
56
|
+
is MarginLayoutParams -> LayoutParams(lp.width, lp.height)
|
|
58
57
|
else -> LayoutParams(
|
|
59
58
|
lp?.width ?: LayoutParams.WRAP_CONTENT,
|
|
60
59
|
lp?.height ?: LayoutParams.WRAP_CONTENT
|
|
@@ -505,9 +504,9 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
|
|
|
505
504
|
|
|
506
505
|
fun handleMarkerClick(marker: Marker): Boolean {
|
|
507
506
|
markerViewMap[marker]?.let { view ->
|
|
508
|
-
view.onMarkerPress(mapOf(
|
|
509
|
-
|
|
510
|
-
|
|
507
|
+
view.onMarkerPress.invoke(mapOf(
|
|
508
|
+
"latitude" to marker.position.latitude,
|
|
509
|
+
"longitude" to marker.position.longitude
|
|
511
510
|
))
|
|
512
511
|
// 只有在没有自定义内容(children)且有 title 或 snippet 时才显示信息窗口
|
|
513
512
|
// 如果有自定义内容,说明用户已经自定义了显示内容,不需要默认信息窗口
|
|
@@ -520,21 +519,21 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
|
|
|
520
519
|
}
|
|
521
520
|
|
|
522
521
|
fun handleMarkerDragStart(marker: Marker) {
|
|
523
|
-
markerViewMap[marker]?.onMarkerDragStart(mapOf(
|
|
522
|
+
markerViewMap[marker]?.onMarkerDragStart?.invoke(mapOf(
|
|
524
523
|
"latitude" to marker.position.latitude,
|
|
525
524
|
"longitude" to marker.position.longitude
|
|
526
525
|
))
|
|
527
526
|
}
|
|
528
527
|
|
|
529
528
|
fun handleMarkerDrag(marker: Marker) {
|
|
530
|
-
markerViewMap[marker]?.onMarkerDrag(mapOf(
|
|
529
|
+
markerViewMap[marker]?.onMarkerDrag?.invoke(mapOf(
|
|
531
530
|
"latitude" to marker.position.latitude,
|
|
532
531
|
"longitude" to marker.position.longitude
|
|
533
532
|
))
|
|
534
533
|
}
|
|
535
534
|
|
|
536
535
|
fun handleMarkerDragEnd(marker: Marker) {
|
|
537
|
-
markerViewMap[marker]?.onMarkerDragEnd(mapOf(
|
|
536
|
+
markerViewMap[marker]?.onMarkerDragEnd?.invoke(mapOf(
|
|
538
537
|
"latitude" to marker.position.latitude,
|
|
539
538
|
"longitude" to marker.position.longitude
|
|
540
539
|
))
|
|
@@ -576,39 +575,7 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
|
|
|
576
575
|
}
|
|
577
576
|
}
|
|
578
577
|
|
|
579
|
-
|
|
580
|
-
* 创建默认 marker 图标 (红色大头针)
|
|
581
|
-
*/
|
|
582
|
-
private fun createDefaultMarkerBitmap(): Bitmap {
|
|
583
|
-
val width = 48
|
|
584
|
-
val height = 72
|
|
585
|
-
val bitmap = createBitmap(width, height)
|
|
586
|
-
val canvas = Canvas(bitmap)
|
|
587
|
-
|
|
588
|
-
val paint = Paint(Paint.ANTI_ALIAS_FLAG)
|
|
589
|
-
paint.color = "#FF5252".toColorInt()
|
|
590
|
-
paint.style = Paint.Style.FILL
|
|
591
|
-
|
|
592
|
-
// 绘制圆形顶部
|
|
593
|
-
canvas.drawCircle(width / 2f, width / 2f, width / 2f - 2, paint)
|
|
594
|
-
|
|
595
|
-
// 绘制尖端
|
|
596
|
-
val path = Path()
|
|
597
|
-
path.moveTo(width / 2f, height.toFloat())
|
|
598
|
-
path.lineTo(width / 4f, width / 2f + 10f)
|
|
599
|
-
path.lineTo(3 * width / 4f, width / 2f + 10f)
|
|
600
|
-
path.close()
|
|
601
|
-
canvas.drawPath(path, paint)
|
|
602
|
-
|
|
603
|
-
// 绘制白色边框
|
|
604
|
-
paint.color = Color.WHITE
|
|
605
|
-
paint.style = Paint.Style.STROKE
|
|
606
|
-
paint.strokeWidth = 3f
|
|
607
|
-
canvas.drawCircle(width / 2f, width / 2f, width / 2f - 4, paint)
|
|
608
|
-
|
|
609
|
-
return bitmap
|
|
610
|
-
}
|
|
611
|
-
|
|
578
|
+
|
|
612
579
|
/**
|
|
613
580
|
* 将视图转换为 Bitmap
|
|
614
581
|
*/
|
|
@@ -642,29 +609,7 @@ class MarkerView(context: Context, appContext: AppContext) : ExpoView(context, a
|
|
|
642
609
|
}
|
|
643
610
|
}
|
|
644
611
|
|
|
645
|
-
|
|
646
|
-
* 创建组合 Bitmap:默认 marker + 自定义内容
|
|
647
|
-
*/
|
|
648
|
-
private fun createCombinedBitmap(): Bitmap? {
|
|
649
|
-
val customBitmap = createBitmapFromView() ?: return null
|
|
650
|
-
val markerBitmap = createDefaultMarkerBitmap()
|
|
651
|
-
|
|
652
|
-
val totalWidth = maxOf(markerBitmap.width, customBitmap.width)
|
|
653
|
-
val totalHeight = markerBitmap.height + customBitmap.height + 10
|
|
654
|
-
|
|
655
|
-
val combinedBitmap = Bitmap.createBitmap(totalWidth, totalHeight, Bitmap.Config.ARGB_8888)
|
|
656
|
-
val canvas = Canvas(combinedBitmap)
|
|
657
|
-
|
|
658
|
-
val customX = (totalWidth - customBitmap.width) / 2f
|
|
659
|
-
canvas.drawBitmap(customBitmap, customX, 0f, null)
|
|
660
|
-
|
|
661
|
-
val markerX = (totalWidth - markerBitmap.width) / 2f
|
|
662
|
-
val markerY = customBitmap.height + 10f
|
|
663
|
-
canvas.drawBitmap(markerBitmap, markerX, markerY, null)
|
|
664
|
-
|
|
665
|
-
return combinedBitmap
|
|
666
|
-
}
|
|
667
|
-
|
|
612
|
+
|
|
668
613
|
/**
|
|
669
614
|
* 更新 marker 图标
|
|
670
615
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoGaodeMapModule.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ExpoGaodeMapModule.d.ts","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,21 @@
|
|
|
3
3
|
* 提供 SDK 初始化、定位、权限管理等功能
|
|
4
4
|
*/
|
|
5
5
|
import { requireNativeModule } from 'expo';
|
|
6
|
-
// 获取原生模块实例
|
|
7
|
-
|
|
6
|
+
// 获取原生模块实例 - 添加容错处理
|
|
7
|
+
let nativeModule = null;
|
|
8
|
+
try {
|
|
9
|
+
nativeModule = requireNativeModule('ExpoGaodeMap');
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
console.warn('ExpoGaodeMap 原生模块加载失败:', error);
|
|
13
|
+
}
|
|
14
|
+
// 如果模块加载失败,创建一个空的代理对象防止崩溃
|
|
15
|
+
if (!nativeModule) {
|
|
16
|
+
console.error('ExpoGaodeMap: 原生模块不可用,请检查配置');
|
|
17
|
+
}
|
|
8
18
|
// 扩展原生模块,添加便捷方法
|
|
9
19
|
const ExpoGaodeMapModuleWithHelpers = {
|
|
10
|
-
...nativeModule,
|
|
20
|
+
...(nativeModule || {}),
|
|
11
21
|
/**
|
|
12
22
|
* 添加定位监听器(便捷方法)
|
|
13
23
|
* 自动订阅 onLocationUpdate 事件,提供容错处理
|
|
@@ -17,7 +27,7 @@ const ExpoGaodeMapModuleWithHelpers = {
|
|
|
17
27
|
*/
|
|
18
28
|
addLocationListener(listener) {
|
|
19
29
|
// 使用可选链和空值合并,确保即使模块不可用也不会崩溃
|
|
20
|
-
return nativeModule
|
|
30
|
+
return nativeModule?.addListener?.('onLocationUpdate', listener) || {
|
|
21
31
|
remove: () => { },
|
|
22
32
|
};
|
|
23
33
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoGaodeMapModule.js","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAgPzD,
|
|
1
|
+
{"version":3,"file":"ExpoGaodeMapModule.js","sourceRoot":"","sources":["../src/ExpoGaodeMapModule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAgPzD,oBAAoB;AACpB,IAAI,YAAY,GAA8B,IAAI,CAAC;AAEnD,IAAI,CAAC;IACH,YAAY,GAAG,mBAAmB,CAAqB,cAAc,CAAC,CAAC;AACzE,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,0BAA0B;AAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;AAC/C,CAAC;AAED,gBAAgB;AAChB,MAAM,6BAA6B,GAAG;IACpC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAEvB;;;;;;OAMG;IACH,mBAAmB,CAAC,QAA0B;QAC5C,4BAA4B;QAC5B,OAAO,YAAY,EAAE,WAAW,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,IAAI;YAClE,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC;SACjB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,6BAAmD,CAAC","sourcesContent":["/**\n * 高德地图原生模块\n * 提供 SDK 初始化、定位、权限管理等功能\n */\n\nimport { NativeModule, requireNativeModule } from 'expo';\nimport type { ExpoGaodeMapModuleEvents } from './ExpoGaodeMap.types';\nimport type {\n LatLng,\n CoordinateType,\n Coordinates,\n ReGeocode,\n LocationMode,\n LocationAccuracy,\n LocationListener,\n} from './types';\n\n/**\n * SDK 配置参数\n */\nexport interface SDKConfig {\n /** Android 平台的高德地图 API Key */\n androidKey?: string;\n /** iOS 平台的高德地图 API Key */\n iosKey?: string;\n}\n\n/**\n * 权限状态\n */\nexport interface PermissionStatus {\n /** 是否已授权 */\n granted: boolean;\n /** iOS 权限状态字符串 */\n status?: 'notDetermined' | 'restricted' | 'denied' | 'authorizedAlways' | 'authorizedWhenInUse' | 'unknown';\n /** Android 精确位置权限 */\n fineLocation?: boolean;\n /** Android 粗略位置权限 */\n coarseLocation?: boolean;\n}\n\n/**\n * 高德地图原生模块类声明\n */\ndeclare class ExpoGaodeMapModule extends NativeModule<ExpoGaodeMapModuleEvents> {\n // ==================== SDK 初始化 ====================\n \n /**\n * 初始化高德地图 SDK\n * @param config SDK 配置参数,包含 Android 和 iOS 的 API Key\n */\n initSDK(config: SDKConfig): void;\n \n /**\n * 获取高德地图 SDK 版本号\n * @returns SDK 版本字符串\n */\n getVersion(): string;\n \n // ==================== 定位控制 ====================\n \n /**\n * 开始连续定位\n * 启动后会持续接收位置更新,通过 onLocationUpdate 事件回调\n */\n start(): void;\n \n /**\n * 停止定位\n * 停止接收位置更新\n */\n stop(): void;\n \n /**\n * 检查是否正在定位\n * @returns Promise<boolean> 是否正在定位\n */\n isStarted(): Promise<boolean>;\n \n /**\n * 获取当前位置(单次定位)\n * @returns Promise<Coordinates | ReGeocode> 位置信息,包含坐标和可选的逆地理编码信息\n */\n getCurrentLocation(): Promise<Coordinates | ReGeocode>;\n \n /**\n * 坐标转换\n * 将其他坐标系的坐标转换为高德地图使用的 GCJ-02 坐标系\n * @param coordinate 需要转换的坐标\n * @param type 原坐标系类型\n * @returns Promise<LatLng> 转换后的 GCJ-02 坐标\n */\n coordinateConvert(coordinate: LatLng, type: CoordinateType): Promise<LatLng>;\n \n // ==================== 定位配置 ====================\n \n /**\n * 设置是否返回逆地理编码信息\n * @param isReGeocode true: 返回地址信息; false: 只返回坐标\n */\n setLocatingWithReGeocode(isReGeocode: boolean): void;\n \n /**\n * 设置定位模式(Android)\n * @param mode 定位模式:0-低功耗, 1-仅设备, 2-高精度\n */\n setLocationMode(mode: LocationMode): void;\n \n /**\n * 设置定位间隔(毫秒)\n * @param interval 定位间隔时间,单位毫秒,默认 2000ms\n */\n setInterval(interval: number): void;\n \n /**\n * 设置是否单次定位(Android)\n * @param isOnceLocation true: 单次定位; false: 连续定位\n */\n setOnceLocation(isOnceLocation: boolean): void;\n \n /**\n * 设置是否使用设备传感器(Android)\n * @param sensorEnable true: 使用传感器; false: 不使用\n */\n setSensorEnable(sensorEnable: boolean): void;\n \n /**\n * 设置是否允许 WiFi 扫描(Android)\n * @param wifiScan true: 允许; false: 不允许\n */\n setWifiScan(wifiScan: boolean): void;\n \n /**\n * 设置是否 GPS 优先(Android)\n * @param gpsFirst true: GPS 优先; false: 网络优先\n */\n setGpsFirst(gpsFirst: boolean): void;\n \n /**\n * 设置是否等待 WiFi 列表刷新(Android)\n * @param onceLocationLatest true: 等待; false: 不等待\n */\n setOnceLocationLatest(onceLocationLatest: boolean): void;\n \n /**\n * 设置逆地理编码语言\n * @param language 语言代码,如 \"zh-CN\", \"en\"\n */\n setGeoLanguage(language: string): void;\n \n /**\n * 设置是否使用缓存策略(Android)\n * @param locationCacheEnable true: 使用缓存; false: 不使用\n */\n setLocationCacheEnable(locationCacheEnable: boolean): void;\n \n /**\n * 设置网络请求超时时间(Android)\n * @param httpTimeOut 超时时间,单位毫秒\n */\n setHttpTimeOut(httpTimeOut: number): void;\n \n /**\n * 设置期望的定位精度(iOS)\n * @param accuracy 精度级别:0-最佳, 1-10米, 2-100米, 3-1公里, 4-3公里\n */\n setDesiredAccuracy(accuracy: LocationAccuracy): void;\n \n /**\n * 设置定位超时时间(秒)\n * @param timeout 超时时间,单位秒,默认 10 秒\n */\n setLocationTimeout(timeout: number): void;\n \n /**\n * 设置逆地理编码超时时间(秒)\n * @param timeout 超时时间,单位秒,默认 5 秒\n */\n setReGeocodeTimeout(timeout: number): void;\n \n /**\n * 设置距离过滤器(米)(iOS)\n * 只有移动超过指定距离才会更新位置\n * @param distance 距离阈值,单位米\n */\n setDistanceFilter(distance: number): void;\n \n /**\n * 设置是否自动暂停位置更新(iOS)\n * @param pauses true: 自动暂停; false: 不暂停\n */\n setPausesLocationUpdatesAutomatically(pauses: boolean): void;\n \n /**\n * 设置是否允许后台定位(iOS)\n * @param allows true: 允许; false: 不允许\n */\n setAllowsBackgroundLocationUpdates(allows: boolean): void;\n \n /**\n * 设置定位协议\n * @param protocol 协议类型\n */\n setLocationProtocol(protocol: string): void;\n \n // ==================== 方向更新 (iOS) ====================\n \n /**\n * 开始更新设备方向(罗盘朝向)\n * 通过 onHeadingUpdate 事件接收方向更新\n * @platform ios\n */\n startUpdatingHeading(): void;\n \n /**\n * 停止更新设备方向\n * @platform ios\n */\n stopUpdatingHeading(): void;\n \n // ==================== 权限管理 ====================\n \n /**\n * 检查位置权限状态\n * @returns Promise<PermissionStatus> 权限状态\n */\n checkLocationPermission(): Promise<PermissionStatus>;\n \n /**\n * 请求位置权限\n * @returns Promise<PermissionStatus> 请求后的权限状态\n */\n requestLocationPermission(): Promise<PermissionStatus>;\n \n // ==================== 便捷方法 ====================\n \n /**\n * 添加定位监听器(便捷方法)\n * 封装了 addListener,提供更简洁的 API\n * @param listener 定位回调函数\n * @returns 订阅对象,调用 remove() 取消监听\n */\n addLocationListener(listener: LocationListener): { remove: () => void };\n}\n\n// 获取原生模块实例 - 添加容错处理\nlet nativeModule: ExpoGaodeMapModule | null = null;\n\ntry {\n nativeModule = requireNativeModule<ExpoGaodeMapModule>('ExpoGaodeMap');\n} catch (error) {\n console.warn('ExpoGaodeMap 原生模块加载失败:', error);\n}\n\n// 如果模块加载失败,创建一个空的代理对象防止崩溃\nif (!nativeModule) {\n console.error('ExpoGaodeMap: 原生模块不可用,请检查配置');\n}\n\n// 扩展原生模块,添加便捷方法\nconst ExpoGaodeMapModuleWithHelpers = {\n ...(nativeModule || {}),\n \n /**\n * 添加定位监听器(便捷方法)\n * 自动订阅 onLocationUpdate 事件,提供容错处理\n * @param listener 定位回调函数\n * @returns 订阅对象,调用 remove() 取消监听\n * @throws 如果底层模块不可用,返回一个空操作的订阅对象\n */\n addLocationListener(listener: LocationListener): { remove: () => void } {\n // 使用可选链和空值合并,确保即使模块不可用也不会崩溃\n return nativeModule?.addListener?.('onLocationUpdate', listener) || {\n remove: () => {},\n };\n },\n};\n\nexport default ExpoGaodeMapModuleWithHelpers as ExpoGaodeMapModule;\n"]}
|
package/package.json
CHANGED
|
@@ -243,12 +243,23 @@ declare class ExpoGaodeMapModule extends NativeModule<ExpoGaodeMapModuleEvents>
|
|
|
243
243
|
addLocationListener(listener: LocationListener): { remove: () => void };
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
// 获取原生模块实例
|
|
247
|
-
|
|
246
|
+
// 获取原生模块实例 - 添加容错处理
|
|
247
|
+
let nativeModule: ExpoGaodeMapModule | null = null;
|
|
248
|
+
|
|
249
|
+
try {
|
|
250
|
+
nativeModule = requireNativeModule<ExpoGaodeMapModule>('ExpoGaodeMap');
|
|
251
|
+
} catch (error) {
|
|
252
|
+
console.warn('ExpoGaodeMap 原生模块加载失败:', error);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// 如果模块加载失败,创建一个空的代理对象防止崩溃
|
|
256
|
+
if (!nativeModule) {
|
|
257
|
+
console.error('ExpoGaodeMap: 原生模块不可用,请检查配置');
|
|
258
|
+
}
|
|
248
259
|
|
|
249
260
|
// 扩展原生模块,添加便捷方法
|
|
250
261
|
const ExpoGaodeMapModuleWithHelpers = {
|
|
251
|
-
...nativeModule,
|
|
262
|
+
...(nativeModule || {}),
|
|
252
263
|
|
|
253
264
|
/**
|
|
254
265
|
* 添加定位监听器(便捷方法)
|
|
@@ -259,7 +270,7 @@ const ExpoGaodeMapModuleWithHelpers = {
|
|
|
259
270
|
*/
|
|
260
271
|
addLocationListener(listener: LocationListener): { remove: () => void } {
|
|
261
272
|
// 使用可选链和空值合并,确保即使模块不可用也不会崩溃
|
|
262
|
-
return nativeModule
|
|
273
|
+
return nativeModule?.addListener?.('onLocationUpdate', listener) || {
|
|
263
274
|
remove: () => {},
|
|
264
275
|
};
|
|
265
276
|
},
|