diff --git a/README.md b/README.md index bb07ba38..2467097b 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ BaiduMapManager.initSDK('sIMQlfmOXhQmPLF1QMh4aBp8zZO9Lb2A'); | onMapPoiClick | func | undefined| #### Overlay 覆盖物 - const { Marker, Cluster, Arc, Circle, Polyline, Polygon, Text, InfoWindow } = Overlay; + const { Marker, Cluster, Arc, Circle, Polyline, Polygon, InfoWindow, HeatMap } = Overlay; ##### 颜色取值说明 6 位(RRGGBB)或 8 位(AARRGGBB) @@ -175,6 +175,9 @@ BaiduMapManager.initSDK('sIMQlfmOXhQmPLF1QMh4aBp8zZO9Lb2A'); | rotate | float | | | location | object|{latitude: 0, longitude: 0} + +##### MarkerIcon 使用 View 作为 marker 的 icon + ##### InfoWindow Props 属性 必须作为 Marker 的子组件 @@ -182,13 +185,25 @@ BaiduMapManager.initSDK('sIMQlfmOXhQmPLF1QMh4aBp8zZO9Lb2A'); | ----------------------- |:-----:| :-------:| ------- | offsetY | int | 0 | 相对于 point 在 y 轴的偏移量,仅 Android +#### HeatMap Props 属性 + +| Prop | Type | Default | Description +| ----------------------- |:-----:| :-------:| ------- +| points | array | | +| gradient | object| { colors: ['66FF00', 'FF0000'], startPoints: [0.2, 1.0] } | 颜色渐变对象 + ```jsx - + + + + ABC + + @@ -197,7 +212,8 @@ BaiduMapManager.initSDK('sIMQlfmOXhQmPLF1QMh4aBp8zZO9Lb2A'); - + text + ``` diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/BaiduMapPackage.java b/android/src/main/java/org/lovebing/reactnative/baidumap/BaiduMapPackage.java index 4fcfe934..e01c9c9c 100644 --- a/android/src/main/java/org/lovebing/reactnative/baidumap/BaiduMapPackage.java +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/BaiduMapPackage.java @@ -27,6 +27,7 @@ import org.lovebing.reactnative.baidumap.module.GetDistanceModule; import org.lovebing.reactnative.baidumap.module.MapAppModule; import org.lovebing.reactnative.baidumap.uimanager.*; +import org.lovebing.reactnative.baidumap.view.OverlayMarkerIcon; /** @@ -53,6 +54,7 @@ public List createViewManagers( new MapViewManager(), new OverlayClusterManager(), new OverlayMarkerManager(), + new OverlayMarkerIconManager(), new OverlayOverlayInfoWindowManager(), new OverlayArcManager(), new OverlayCircleManager(), diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/listener/MapListener.java b/android/src/main/java/org/lovebing/reactnative/baidumap/listener/MapListener.java index 08138beb..c2acb921 100644 --- a/android/src/main/java/org/lovebing/reactnative/baidumap/listener/MapListener.java +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/listener/MapListener.java @@ -7,6 +7,8 @@ package org.lovebing.reactnative.baidumap.listener; +import android.util.Log; + import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.map.MapPoi; diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/uimanager/OverlayMarkerIconManager.java b/android/src/main/java/org/lovebing/reactnative/baidumap/uimanager/OverlayMarkerIconManager.java new file mode 100644 index 00000000..36256e00 --- /dev/null +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/uimanager/OverlayMarkerIconManager.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2016-present, lovebing.net. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package org.lovebing.reactnative.baidumap.uimanager; + +import androidx.annotation.NonNull; +import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.ViewGroupManager; +import org.lovebing.reactnative.baidumap.view.OverlayMarkerIcon; + +/** + * @author lovebing + * @date 2020-06-07 + */ +public class OverlayMarkerIconManager extends ViewGroupManager { + + @NonNull + @Override + public String getName() { + return "BaiduMapOverlayMarkerIcon"; + } + + @NonNull + @Override + protected OverlayMarkerIcon createViewInstance(@NonNull ThemedReactContext reactContext) { + return new OverlayMarkerIcon(reactContext); + } +} diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/uimanager/OverlayMarkerManager.java b/android/src/main/java/org/lovebing/reactnative/baidumap/uimanager/OverlayMarkerManager.java index 773a43a4..dff6d5c3 100644 --- a/android/src/main/java/org/lovebing/reactnative/baidumap/uimanager/OverlayMarkerManager.java +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/uimanager/OverlayMarkerManager.java @@ -19,6 +19,7 @@ import org.lovebing.reactnative.baidumap.util.LatLngUtil; import org.lovebing.reactnative.baidumap.view.OverlayInfoWindow; import org.lovebing.reactnative.baidumap.view.OverlayMarker; +import org.lovebing.reactnative.baidumap.view.OverlayMarkerIcon; public class OverlayMarkerManager extends ViewGroupManager { @@ -87,6 +88,8 @@ public void setFlat(OverlayMarker overlayMarker, boolean flat) { public void addView(OverlayMarker parent, View child, int index) { if (child instanceof OverlayInfoWindow) { parent.setOverlayInfoWindow((OverlayInfoWindow) child); + } else if (child instanceof OverlayMarkerIcon) { + parent.setIconView(child); } super.addView(parent, child, index); } diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/util/BitmapUtil.java b/android/src/main/java/org/lovebing/reactnative/baidumap/util/BitmapUtil.java new file mode 100644 index 00000000..dce8a0c7 --- /dev/null +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/util/BitmapUtil.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016-present, lovebing.net. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package org.lovebing.reactnative.baidumap.util; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.view.View; + +import com.baidu.mapapi.map.BitmapDescriptor; +import com.baidu.mapapi.map.BitmapDescriptorFactory; + +/** + * @author lovebing + * @date 2020-05-25 + */ +public class BitmapUtil { + + public static BitmapDescriptor createBitmapDescriptor(View view) { + return createBitmapDescriptor(view, 0, 0); + } + + public static BitmapDescriptor createBitmapDescriptor(View view, int width, int height) { + if (width > 0 && height > 0) { + view.layout(0, 0, width, height); + } else if (view.getMeasuredWidth() == 0 || view.getMeasuredHeight() == 0) { + view.layout(0, 0, view.getMeasuredWidth() > 0 ? view.getMeasuredWidth() : 50, view.getMeasuredHeight() > 0 ? view.getMeasuredHeight() : 100); + } + view.buildDrawingCache(); + BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(view.getDrawingCache()); + view.destroyDrawingCache(); + return bitmapDescriptor; + } + + public static Bitmap resizeBitmap(Bitmap bitmap, int width, int height) { + float scaleWidth = ((float) width) / bitmap.getWidth(); + float scaleHeight = ((float) height) / bitmap.getHeight(); + Matrix matrix = new Matrix(); + matrix.postScale(scaleWidth, scaleHeight); + return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + } +} diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayHeatMap.java b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayHeatMap.java index c329c22d..8f1994cd 100644 --- a/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayHeatMap.java +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayHeatMap.java @@ -69,7 +69,9 @@ public void addTopMap(BaiduMap baiduMap) { @Override public void removeFromMap(BaiduMap baiduMap) { - heatMap.removeHeatMap(); - heatMap = null; + if (heatMap != null) { + heatMap.removeHeatMap(); + heatMap = null; + } } } diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayInfoWindow.java b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayInfoWindow.java index 6f51f262..efb3d1e5 100644 --- a/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayInfoWindow.java +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayInfoWindow.java @@ -8,13 +8,13 @@ package org.lovebing.reactnative.baidumap.view; import android.content.Context; - import com.baidu.mapapi.map.BitmapDescriptor; -import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.model.LatLng; import com.facebook.react.views.view.ReactViewGroup; +import org.lovebing.reactnative.baidumap.util.BitmapUtil; + /** * @author lovebing Created on Dec 09, 2018 */ @@ -52,18 +52,11 @@ public void setOffsetY(int offsetY) { private void updateInfoWindow(LatLng location) { if (infoWindow == null) { - BitmapDescriptor bitmap; - if (width > 0 && height > 0) { - layout(0, 0, width, height); - } else if (getMeasuredWidth() == 0 || getMeasuredHeight() == 0) { - layout(0, 0, getMeasuredWidth() > 0 ? getMeasuredWidth() : 50, getMeasuredHeight() > 0 ? getMeasuredHeight() : 100); - } - buildDrawingCache(); - bitmap = BitmapDescriptorFactory.fromBitmap(getDrawingCache()); - if (bitmap == null) { + BitmapDescriptor bitmapDescriptor = BitmapUtil.createBitmapDescriptor(this, width, height); + if (bitmapDescriptor == null) { return; } - infoWindow = new InfoWindow(bitmap, location, offsetY, new InfoWindow.OnInfoWindowClickListener() { + infoWindow = new InfoWindow(bitmapDescriptor, location, offsetY, new InfoWindow.OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayMarker.java b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayMarker.java index 96e6b6e3..41b7cc88 100644 --- a/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayMarker.java +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayMarker.java @@ -10,12 +10,12 @@ import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; -import android.graphics.Matrix; import android.graphics.drawable.Animatable; import android.net.Uri; import android.util.AttributeSet; import android.util.Log; +import android.view.View; import android.view.ViewGroup; import android.widget.Button; @@ -41,6 +41,7 @@ import org.lovebing.reactnative.baidumap.R; import org.lovebing.reactnative.baidumap.model.IconInfo; +import org.lovebing.reactnative.baidumap.util.BitmapUtil; import java.util.Objects; @@ -60,6 +61,7 @@ public class OverlayMarker extends ViewGroup implements OverlayView, ClusterItem private OverlayInfoWindow overlayInfoWindow; private volatile boolean loadingImage = false; private InfoWindow titleInfoWindow; + private View iconView; private final ControllerListener imageControllerListener = new BaseControllerListener() { @@ -157,6 +159,14 @@ public void setOverlayInfoWindow(OverlayInfoWindow overlayInfoWindow) { this.overlayInfoWindow = overlayInfoWindow; } + public void setIconView(View iconView) { + this.iconView = iconView; + if (marker != null) { + iconBitmapDescriptor = BitmapUtil.createBitmapDescriptor(iconView); + marker.setIcon(iconBitmapDescriptor); + } + } + public String getTitle() { return title; } @@ -181,14 +191,6 @@ public void setPosition(LatLng position) { } } - public BitmapDescriptor getIconBitmapDescriptor() { - return iconBitmapDescriptor; - } - - public void setIconBitmapDescriptor(BitmapDescriptor iconBitmapDescriptor) { - this.iconBitmapDescriptor = iconBitmapDescriptor; - } - public Float getRotate() { return rotate; } @@ -200,10 +202,6 @@ public void setRotate(Float rotate) { } } - public Boolean getFlat() { - return flat; - } - public void setFlat(Boolean flat) { this.flat = flat; if (marker != null) { @@ -211,10 +209,6 @@ public void setFlat(Boolean flat) { } } - public Boolean getPerspective() { - return perspective; - } - public void setPerspective(Boolean perspective) { this.perspective = perspective; if (marker != null) { @@ -253,23 +247,16 @@ public void setIcon(IconInfo iconInfo) { @Override public BitmapDescriptor getBitmapDescriptor() { BitmapDescriptor result; - if (getIconBitmapDescriptor() != null) { - result = getIconBitmapDescriptor(); + if (iconBitmapDescriptor != null) { + result = iconBitmapDescriptor; } else { result = BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding); } if (iconInfo != null && iconInfo.getWidth() > 0 && iconInfo.getHeight() > 0) { - int height = result.getBitmap().getHeight(); - int width = result.getBitmap().getWidth(); - float scaleWidth = ((float) iconInfo.getWidth()) / width; - float scaleHeight = ((float) iconInfo.getHeight()) / height; - Matrix matrix = new Matrix(); - matrix.postScale(scaleWidth, scaleHeight); - - Bitmap newBitmap = Bitmap.createBitmap(result.getBitmap(), 0, 0, width, height, matrix, true); - result = BitmapDescriptorFactory.fromBitmap(newBitmap); + result = BitmapDescriptorFactory.fromBitmap(BitmapUtil.resizeBitmap(result.getBitmap(), + iconInfo.getWidth(), iconInfo.getHeight())); } return result; } @@ -297,6 +284,10 @@ public void removeFromMap(BaiduMap baiduMap) { if (marker != null) { marker.remove(); marker = null; + overlayInfoWindow = null; + titleInfoWindow = null; + iconView = null; + iconBitmapDescriptor = null; } } @@ -315,12 +306,13 @@ public int hashCode() { } private void addOverlay(BaiduMap baiduMap) { - BitmapDescriptor icon = getBitmapDescriptor(); + if (iconView != null) { + iconBitmapDescriptor = BitmapUtil.createBitmapDescriptor(iconView); + } MarkerOptions option = new MarkerOptions() .position(position) - .title(getTitle()) .alpha(getAlpha()) - .icon(icon); + .icon(getBitmapDescriptor()); if (rotate != null) { option.rotate(rotate); } diff --git a/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayMarkerIcon.java b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayMarkerIcon.java new file mode 100644 index 00000000..78d7f398 --- /dev/null +++ b/android/src/main/java/org/lovebing/reactnative/baidumap/view/OverlayMarkerIcon.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2016-present, lovebing.net. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package org.lovebing.reactnative.baidumap.view; + +import android.content.Context; +import com.facebook.react.views.view.ReactViewGroup; + +/** + * @author lovebing + * @date 2020-06-07 + */ +public class OverlayMarkerIcon extends ReactViewGroup { + + public OverlayMarkerIcon(Context context) { + super(context); + } +} diff --git a/ios/RCTBaiduMap.xcodeproj/project.pbxproj b/ios/RCTBaiduMap.xcodeproj/project.pbxproj index 75140cfd..6d1266b0 100644 --- a/ios/RCTBaiduMap.xcodeproj/project.pbxproj +++ b/ios/RCTBaiduMap.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ EF824B6F234A18AD009E6523 /* BMKCluster.m in Sources */ = {isa = PBXBuildFile; fileRef = EF824B6A234A18AD009E6523 /* BMKCluster.m */; }; EF824B70234A18AD009E6523 /* BMKClusterQuadtree.m in Sources */ = {isa = PBXBuildFile; fileRef = EF824B6B234A18AD009E6523 /* BMKClusterQuadtree.m */; }; EF824B72234A18AD009E6523 /* BMKClusterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF824B6E234A18AD009E6523 /* BMKClusterManager.m */; }; + EF9F1D7D24783377007FB307 /* OverlayHeatMap.m in Sources */ = {isa = PBXBuildFile; fileRef = EF9F1D7C24783377007FB307 /* OverlayHeatMap.m */; }; + EF9F1D802478DECC007FB307 /* OverlayHeatMapManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF9F1D7F2478DECC007FB307 /* OverlayHeatMapManager.m */; }; EFB77A4A234AF69B00A17DDF /* OverlayPolyline.m in Sources */ = {isa = PBXBuildFile; fileRef = EFB77A45234AF69B00A17DDF /* OverlayPolyline.m */; }; EFB77A4B234AF69B00A17DDF /* OverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = EFB77A47234AF69B00A17DDF /* OverlayView.m */; }; EFB77A4C234AF69B00A17DDF /* OverlayMarker.m in Sources */ = {isa = PBXBuildFile; fileRef = EFB77A48234AF69B00A17DDF /* OverlayMarker.m */; }; @@ -37,6 +39,8 @@ EFB77A65234B0B3B00A17DDF /* ClusterAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = EFB77A64234B0B3B00A17DDF /* ClusterAnnotation.m */; }; EFB77A6A234B792F00A17DDF /* OverlayCluster.m in Sources */ = {isa = PBXBuildFile; fileRef = EFB77A66234B792F00A17DDF /* OverlayCluster.m */; }; EFB77A6B234B792F00A17DDF /* OverlayClusterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EFB77A68234B792F00A17DDF /* OverlayClusterManager.m */; }; + EFC6BFFB248D0FE4003DB9CE /* OverlayMarkerIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = EFC6BFFA248D0FE4003DB9CE /* OverlayMarkerIcon.m */; }; + EFC6BFFE248D1093003DB9CE /* OverlayMarkerIconManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EFC6BFFD248D1093003DB9CE /* OverlayMarkerIconManager.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -93,6 +97,10 @@ EF824B6A234A18AD009E6523 /* BMKCluster.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BMKCluster.m; sourceTree = ""; }; EF824B6B234A18AD009E6523 /* BMKClusterQuadtree.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BMKClusterQuadtree.m; sourceTree = ""; }; EF824B6E234A18AD009E6523 /* BMKClusterManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BMKClusterManager.m; sourceTree = ""; }; + EF9F1D7B24783355007FB307 /* OverlayHeatMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OverlayHeatMap.h; sourceTree = ""; }; + EF9F1D7C24783377007FB307 /* OverlayHeatMap.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OverlayHeatMap.m; sourceTree = ""; }; + EF9F1D7E2478DEBA007FB307 /* OverlayHeatMapManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OverlayHeatMapManager.h; sourceTree = ""; }; + EF9F1D7F2478DECC007FB307 /* OverlayHeatMapManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OverlayHeatMapManager.m; sourceTree = ""; }; EFB77A44234AF69A00A17DDF /* OverlayMarker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayMarker.h; sourceTree = ""; }; EFB77A45234AF69B00A17DDF /* OverlayPolyline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverlayPolyline.m; sourceTree = ""; }; EFB77A46234AF69B00A17DDF /* OverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayView.h; sourceTree = ""; }; @@ -111,6 +119,10 @@ EFB77A67234B792F00A17DDF /* OverlayCluster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayCluster.h; sourceTree = ""; }; EFB77A68234B792F00A17DDF /* OverlayClusterManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverlayClusterManager.m; sourceTree = ""; }; EFB77A69234B792F00A17DDF /* OverlayClusterManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayClusterManager.h; sourceTree = ""; }; + EFC6BFF9248D0FCB003DB9CE /* OverlayMarkerIcon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OverlayMarkerIcon.h; sourceTree = ""; }; + EFC6BFFA248D0FE4003DB9CE /* OverlayMarkerIcon.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OverlayMarkerIcon.m; sourceTree = ""; }; + EFC6BFFC248D1086003DB9CE /* OverlayMarkerIconManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OverlayMarkerIconManager.h; sourceTree = ""; }; + EFC6BFFD248D1093003DB9CE /* OverlayMarkerIconManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OverlayMarkerIconManager.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -219,6 +231,10 @@ EF18EB27246FE35E005A2F4D /* OverlayPolygon.m */, EF18EB32246FE856005A2F4D /* InfoWindow.h */, EF18EB33246FE863005A2F4D /* InfoWindow.m */, + EF9F1D7C24783377007FB307 /* OverlayHeatMap.m */, + EF9F1D7B24783355007FB307 /* OverlayHeatMap.h */, + EFC6BFF9248D0FCB003DB9CE /* OverlayMarkerIcon.h */, + EFC6BFFA248D0FE4003DB9CE /* OverlayMarkerIcon.m */, ); path = Views; sourceTree = ""; @@ -238,6 +254,10 @@ EF18EB2A246FE383005A2F4D /* OverlayPolygonManager.m */, EF18EB35246FE873005A2F4D /* InfoWindowManager.h */, EF18EB36246FE885005A2F4D /* InfoWindowManager.m */, + EF9F1D7E2478DEBA007FB307 /* OverlayHeatMapManager.h */, + EF9F1D7F2478DECC007FB307 /* OverlayHeatMapManager.m */, + EFC6BFFC248D1086003DB9CE /* OverlayMarkerIconManager.h */, + EFC6BFFD248D1093003DB9CE /* OverlayMarkerIconManager.m */, ); path = ViewManagers; sourceTree = ""; @@ -354,12 +374,14 @@ EF7F66C42369F9B600D1D9DC /* BaiduMapAppModule.m in Sources */, EF18EB1C246FC829005A2F4D /* OverlayArc.m in Sources */, EF18EB1F246FC84C005A2F4D /* OverlayArcManager.m in Sources */, + EF9F1D802478DECC007FB307 /* OverlayHeatMapManager.m in Sources */, EF18EB3C246FE899005A2F4D /* GetDistanceModule.m in Sources */, EFB77A53234AF6E300A17DDF /* OverlayMarkerManager.m in Sources */, EF18EAEB246FB87A005A2F4D /* OverlayCircle.m in Sources */, EFB77A52234AF6E300A17DDF /* OverlayPolylineManager.m in Sources */, EF18EB2B246FE383005A2F4D /* OverlayPolygonManager.m in Sources */, EFB77A4A234AF69B00A17DDF /* OverlayPolyline.m in Sources */, + EF9F1D7D24783377007FB307 /* OverlayHeatMap.m in Sources */, EF4ABB0D1DC378CF008E75C9 /* GeolocationModule.m in Sources */, EFB77A4C234AF69B00A17DDF /* OverlayMarker.m in Sources */, EF18EB37246FE885005A2F4D /* InfoWindowManager.m in Sources */, @@ -374,7 +396,9 @@ EF18EB34246FE863005A2F4D /* InfoWindow.m in Sources */, EFB77A6B234B792F00A17DDF /* OverlayClusterManager.m in Sources */, EF18EAA0246F07A6005A2F4D /* BMKPointAnnotationPro.m in Sources */, + EFC6BFFB248D0FE4003DB9CE /* OverlayMarkerIcon.m in Sources */, EFB77A6A234B792F00A17DDF /* OverlayCluster.m in Sources */, + EFC6BFFE248D1093003DB9CE /* OverlayMarkerIconManager.m in Sources */, EF824B6F234A18AD009E6523 /* BMKCluster.m in Sources */, EF824B70234A18AD009E6523 /* BMKClusterQuadtree.m in Sources */, ); diff --git a/ios/RCTBaiduMap/ViewManagers/OverlayHeatMapManager.h b/ios/RCTBaiduMap/ViewManagers/OverlayHeatMapManager.h new file mode 100644 index 00000000..acaf1627 --- /dev/null +++ b/ios/RCTBaiduMap/ViewManagers/OverlayHeatMapManager.h @@ -0,0 +1,19 @@ +// +// OverlayHeatMapManager.h +// RCTBaiduMap +// +// Created by lovebing on 2020/5/23. +// Copyright © 2020 lovebing.net. All rights reserved. +// + +#ifndef OverlayHeatMapManager_h +#define OverlayHeatMapManager_h + +#import "OverlayHeatMap.h" +#import + +@interface OverlayHeatMapManager : RCTViewManager + +@end + +#endif /* OverlayHeatMapManager_h */ diff --git a/ios/RCTBaiduMap/ViewManagers/OverlayHeatMapManager.m b/ios/RCTBaiduMap/ViewManagers/OverlayHeatMapManager.m new file mode 100644 index 00000000..59631ef5 --- /dev/null +++ b/ios/RCTBaiduMap/ViewManagers/OverlayHeatMapManager.m @@ -0,0 +1,24 @@ +// +// OverlayHeatMapManager.m +// RCTBaiduMap +// +// Created by lovebing on 2020/5/23. +// Copyright © 2020 lovebing.net. All rights reserved. +// + +#import "OverlayHeatMapManager.h" + +@implementation OverlayHeatMapManager + +RCT_EXPORT_MODULE(BaiduMapOverlayHeatMap) + +RCT_EXPORT_VIEW_PROPERTY(points, NSArray*) +RCT_EXPORT_VIEW_PROPERTY(gradient, NSDictionary*) + +- (UIView *)view { + OverlayHeatMap *heatMap = [OverlayHeatMap new]; + heatMap.bridge = self.bridge; + return heatMap; +} + +@end diff --git a/ios/RCTBaiduMap/ViewManagers/OverlayMarkerIconManager.h b/ios/RCTBaiduMap/ViewManagers/OverlayMarkerIconManager.h new file mode 100644 index 00000000..ace67491 --- /dev/null +++ b/ios/RCTBaiduMap/ViewManagers/OverlayMarkerIconManager.h @@ -0,0 +1,19 @@ +// +// OverlayMarkerIconManager.h +// RCTBaiduMap +// +// Created by lovebing on 2020/6/7. +// Copyright © 2020 lovebing.org. All rights reserved. +// + +#ifndef OverlayMarkerIconManager_h +#define OverlayMarkerIconManager_h + +#import "OverlayMarkerIcon.h" +#import + +@interface OverlayMarkerIconManager : RCTViewManager + +@end + +#endif /* OverlayMarkerIconManager_h */ diff --git a/ios/RCTBaiduMap/ViewManagers/OverlayMarkerIconManager.m b/ios/RCTBaiduMap/ViewManagers/OverlayMarkerIconManager.m new file mode 100644 index 00000000..cff1535b --- /dev/null +++ b/ios/RCTBaiduMap/ViewManagers/OverlayMarkerIconManager.m @@ -0,0 +1,21 @@ +// +// OverlayMarkerIconManager.m +// RCTBaiduMap +// +// Created by lovebing on 2020/6/7. +// Copyright © 2020 lovebing.org. All rights reserved. +// + +#import "OverlayMarkerIconManager.h" + +@implementation OverlayMarkerIconManager + +RCT_EXPORT_MODULE(BaiduMapOverlayMarkerIcon) + +- (UIView *)view { + OverlayMarkerIcon *markerIcon = [OverlayMarkerIcon new]; + markerIcon.bridge = self.bridge; + return markerIcon; +} + +@end diff --git a/ios/RCTBaiduMap/Views/OverlayHeatMap.h b/ios/RCTBaiduMap/Views/OverlayHeatMap.h new file mode 100644 index 00000000..b026a1c3 --- /dev/null +++ b/ios/RCTBaiduMap/Views/OverlayHeatMap.h @@ -0,0 +1,25 @@ +// +// OverlayHeatMap.h +// RCTBaiduMap +// +// Created by lovebing on 2020/5/23. +// Copyright © 2020 lovebing.net. All rights reserved. +// + +#ifndef OverlayHeatMap_h +#define OverlayHeatMap_h + +#import "OverlayView.h" +#import "OverlayUtils.h" +#import + +@interface OverlayHeatMap : OverlayView + +@property (nonatomic, weak) RCTBridge *bridge; +@property (nonatomic, strong) NSArray *points; +@property (nonatomic, strong) NSDictionary *gradient; +@property (nonatomic, strong) BMKHeatMap *heatMap; + +@end + +#endif /* OverlayHeatMap_h */ diff --git a/ios/RCTBaiduMap/Views/OverlayHeatMap.m b/ios/RCTBaiduMap/Views/OverlayHeatMap.m new file mode 100644 index 00000000..44aa12da --- /dev/null +++ b/ios/RCTBaiduMap/Views/OverlayHeatMap.m @@ -0,0 +1,38 @@ +// +// OverlayHeatMap.m +// RCTBaiduMap +// +// Created by lovebing on 2020/5/23. +// Copyright © 2020 lovebing.net. All rights reserved. +// + +#import "OverlayHeatMap.h" + +@implementation OverlayHeatMap + +- (NSString *)getType { + return @"heatMap"; +} + +- (void)addToMap:(BMKMapView *)mapView { + if (_heatMap == nil) { + _heatMap = [[BMKHeatMap alloc]init]; + } + [self update]; + [mapView addHeatMap:_heatMap] ; +} + +- (void)update { + NSMutableArray *data = [NSMutableArray array]; + for (NSDictionary *point in _points) { + BMKHeatMapNode *heatMapNode = [[BMKHeatMapNode alloc]init]; + heatMapNode.pt = [OverlayUtils getCoorFromOption:point]; + [data addObject:heatMapNode]; + } + _heatMap.mData = data; +} + +- (void)removeFromMap:(BMKMapView *)mapView { + [mapView removeHeatMap]; +} +@end diff --git a/ios/RCTBaiduMap/Views/OverlayMarker.m b/ios/RCTBaiduMap/Views/OverlayMarker.m index 4ffd531b..09664267 100644 --- a/ios/RCTBaiduMap/Views/OverlayMarker.m +++ b/ios/RCTBaiduMap/Views/OverlayMarker.m @@ -10,6 +10,7 @@ #import #import #import "InfoWindow.h" +#import "OverlayMarkerIcon.h" @implementation OverlayMarker { RCTImageLoaderCancellationBlock _reloadImageCancellationBlock; @@ -117,6 +118,15 @@ - (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)atIndex { [_annotation.customPopView addSubview:subview]; [_annotation updatePaopaoView]; }); + } else if([subview isKindOfClass:[OverlayMarkerIcon class]]) { + UIGraphicsBeginImageContextWithOptions(subview.frame.size, YES, [UIScreen mainScreen].scale); + [subview.layer renderInContext:UIGraphicsGetCurrentContext()]; + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + dispatch_async(dispatch_get_main_queue(), ^{ + _annotation.annotationView.image = nil; + [_annotation.annotationView addSubview:subview]; + }); } [super insertReactSubview:subview atIndex:atIndex]; } @@ -127,6 +137,8 @@ - (void)removeReactSubview:(UIView *)subview { dispatch_async(dispatch_get_main_queue(), ^{ _annotation.annotationView = nil; }); + } else if([subview isKindOfClass:[OverlayMarkerIcon class]]) { + [_annotation.annotationView removeReactSubview:subview]; } [super removeReactSubview:subview]; } diff --git a/ios/RCTBaiduMap/Views/OverlayMarkerIcon.h b/ios/RCTBaiduMap/Views/OverlayMarkerIcon.h new file mode 100644 index 00000000..12a9260d --- /dev/null +++ b/ios/RCTBaiduMap/Views/OverlayMarkerIcon.h @@ -0,0 +1,21 @@ +// +// OverlayMarkerIcon.h +// RCTBaiduMap +// +// Created by lovebing on 2020/6/7. +// Copyright © 2020 lovebing.net. All rights reserved. +// + +#ifndef OverlayMarkerIcon_h +#define OverlayMarkerIcon_h + +#import +#import + +@interface OverlayMarkerIcon : UIView + +@property (nonatomic, weak) RCTBridge *bridge; + +@end + +#endif /* OverlayMarkerIcon_h */ diff --git a/ios/RCTBaiduMap/Views/OverlayMarkerIcon.m b/ios/RCTBaiduMap/Views/OverlayMarkerIcon.m new file mode 100644 index 00000000..bed109c3 --- /dev/null +++ b/ios/RCTBaiduMap/Views/OverlayMarkerIcon.m @@ -0,0 +1,14 @@ +// +// OverlayMarkerIcon.m +// RCTBaiduMap +// +// Created by lovebing on 2020/6/7. +// Copyright © 2020 lovebing.net. All rights reserved. +// + +#import "OverlayMarkerIcon.h" + +@implementation OverlayMarkerIcon + + +@end diff --git a/js/Geolocation.js b/js/Geolocation.js index 5c80bf53..72f032b4 100644 --- a/js/Geolocation.js +++ b/js/Geolocation.js @@ -6,9 +6,7 @@ */ import { - requireNativeComponent, NativeModules, - Platform, DeviceEventEmitter } from 'react-native'; diff --git a/js/MapApp.js b/js/MapApp.js index ee89886d..856d3c2f 100644 --- a/js/MapApp.js +++ b/js/MapApp.js @@ -6,10 +6,7 @@ */ import { - requireNativeComponent, - NativeModules, - Platform, - DeviceEventEmitter + NativeModules } from 'react-native'; import React, { diff --git a/js/MapView.js b/js/MapView.js index f3ef57d3..3018bbd8 100644 --- a/js/MapView.js +++ b/js/MapView.js @@ -7,10 +7,7 @@ import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import React, { Component } from 'react'; import PropTypes from 'prop-types'; diff --git a/js/Overlay/Arc.js b/js/Overlay/Arc.js index add33821..e86a089d 100644 --- a/js/Overlay/Arc.js +++ b/js/Overlay/Arc.js @@ -7,10 +7,7 @@ import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import React, { Component } from 'react'; diff --git a/js/Overlay/Circle.js b/js/Overlay/Circle.js index 416090b2..d61f4e08 100644 --- a/js/Overlay/Circle.js +++ b/js/Overlay/Circle.js @@ -7,10 +7,7 @@ import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import React, { Component } from 'react'; diff --git a/js/Overlay/Cluster.js b/js/Overlay/Cluster.js index 753fd2b9..fb7c1d9f 100644 --- a/js/Overlay/Cluster.js +++ b/js/Overlay/Cluster.js @@ -7,10 +7,7 @@ import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import React, { Component } from 'react'; diff --git a/js/Overlay/HeatMap.js b/js/Overlay/HeatMap.js new file mode 100644 index 00000000..88bb8376 --- /dev/null +++ b/js/Overlay/HeatMap.js @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2016-present, lovebing.org. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { + requireNativeComponent, + View +} from 'react-native'; + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +export default class HeatMap extends Component { + static propTypes = { + ...View.propTypes, + points: PropTypes.array, + gradient: PropTypes.object + }; + + static defaultProps = { + points: [{ + latitude: 0, + longitude: 0 + }], + gradient: { + colors: ['66FF00', 'FF0000'], + startPoints: [0.2, 1.0] + } + }; + + constructor() { + super(); + } + + render() { + return ; + } +} +const BaiduMapOverlayHeatMap = requireNativeComponent('BaiduMapOverlayHeatMap', HeatMap); \ No newline at end of file diff --git a/js/Overlay/InfoWindow.js b/js/Overlay/InfoWindow.js index 01ae18be..d2fda0b9 100644 --- a/js/Overlay/InfoWindow.js +++ b/js/Overlay/InfoWindow.js @@ -7,10 +7,7 @@ import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import React, { Component } from 'react'; @@ -31,9 +28,6 @@ export default class InfoWindow extends Component { } render() { - if (Platform.OS === 'ios') { - return ; - } return ; } } diff --git a/js/Overlay/Marker.js b/js/Overlay/Marker.js index cd3362b5..019e3475 100644 --- a/js/Overlay/Marker.js +++ b/js/Overlay/Marker.js @@ -5,12 +5,9 @@ * LICENSE file in the root directory of this source tree. */ - import { +import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import resolveAssetSource from 'react-native/Libraries/Image/resolveAssetSource'; diff --git a/js/Overlay/MarkerIcon.js b/js/Overlay/MarkerIcon.js new file mode 100644 index 00000000..7668a0b1 --- /dev/null +++ b/js/Overlay/MarkerIcon.js @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2016-present, lovebing.org. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { + requireNativeComponent, + View +} from 'react-native'; + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +export default class MarkerIcon extends Component { + static propTypes = { + ...View.propTypes + }; + + constructor() { + super(); + } + + render() { + return ; + } +} +const BaiduMapOverlayMarkerIcon = requireNativeComponent('BaiduMapOverlayMarkerIcon', MarkerIcon); \ No newline at end of file diff --git a/js/Overlay/Polygon.js b/js/Overlay/Polygon.js index fe14d616..c2e7d677 100644 --- a/js/Overlay/Polygon.js +++ b/js/Overlay/Polygon.js @@ -7,10 +7,7 @@ import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import React, { Component } from 'react'; diff --git a/js/Overlay/Polyline.js b/js/Overlay/Polyline.js index 91943d65..59f7cef7 100644 --- a/js/Overlay/Polyline.js +++ b/js/Overlay/Polyline.js @@ -7,10 +7,7 @@ import { requireNativeComponent, - View, - NativeModules, - Platform, - DeviceEventEmitter + View } from 'react-native'; import React, { Component } from 'react'; diff --git a/js/Overlay/Text.js b/js/Overlay/Text.js index 64741237..db72bf0f 100644 --- a/js/Overlay/Text.js +++ b/js/Overlay/Text.js @@ -8,9 +8,7 @@ import { requireNativeComponent, View, - NativeModules, - Platform, - DeviceEventEmitter + Platform } from 'react-native'; import React, { Component } from 'react'; diff --git a/js/Overlay/index.js b/js/Overlay/index.js index 53ec1de0..fa60fdc2 100644 --- a/js/Overlay/index.js +++ b/js/Overlay/index.js @@ -13,6 +13,9 @@ import Text from './Text'; import Marker from './Marker'; import InfoWindow from './InfoWindow'; import Cluster from './Cluster'; +import HeatMap from './HeatMap'; +import MarkerIcon from './MarkerIcon'; + export default { Arc, Circle, @@ -21,5 +24,7 @@ export default { Text, Marker, Cluster, - InfoWindow + InfoWindow, + HeatMap, + MarkerIcon }; \ No newline at end of file diff --git a/package.json b/package.json index 384bfe67..c3c8cc2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-baidu-map", - "version": "1.0.35", + "version": "1.0.36", "description": "Baidu Map SDK modules and views for React Native(Android & iOS), support react native 0.61+. 百度地图 React Native 模块,支持 react native 0.61+,已更新到最新的百度地图 SDK 版本。", "main": "index.js", "scripts": { diff --git a/react-native-baidu-map.podspec b/react-native-baidu-map.podspec index 694fe01a..5737750c 100644 --- a/react-native-baidu-map.podspec +++ b/react-native-baidu-map.podspec @@ -9,7 +9,7 @@ Pod::Spec.new do |s| s.name = "react-native-baidu-map" - s.version = "1.0.35" + s.version = "1.0.36" s.summary = "Baidu Map for React Native" s.description = <<-DESC @@ -41,7 +41,7 @@ Pod::Spec.new do |s| # Supports git, hg, bzr, svn and HTTP. # - s.source = { :http => "http://repo.codeboot.net/pod/http/react-native-baidu-map/1.0.35/source.zip" } + s.source = { :http => "http://repo.codeboot.net/pod/http/react-native-baidu-map/1.0.36/source.zip" } s.source_files = "ios/RCTBaiduMap/**/*.{h,m}" s.exclude_files = ""