/* * 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.annotation.TargetApi; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.ViewGroup; import com.baidu.mapapi.clusterutil.clustering.ClusterManager; import com.baidu.mapapi.map.BaiduMap; import org.lovebing.reactnative.baidumap.listener.MapListener; import java.util.ArrayList; import java.util.List; /** * @author lovebing Created on 10月 07, 2019 */ public class OverlayCluster extends ViewGroup implements OverlayView { private MapListener mapListener; private BaiduMap baiduMap; private List<OverlayMarker> markers = new ArrayList<>(10); private ClusterManager<OverlayMarker> markerClusterManager; public OverlayCluster(Context context) { super(context); } public OverlayCluster(Context context, AttributeSet attrs) { super(context, attrs); } public OverlayCluster(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(21) public OverlayCluster(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { } @Override public void addTopMap(BaiduMap baiduMap) { this.baiduMap = baiduMap; if (markerClusterManager == null) { markerClusterManager = new ClusterManager<>(getContext(), baiduMap); mapListener.addMapStatusChangeListener(markerClusterManager); Log.i("OverlayCluster", "addMapStatusChangeListener"); } refresh(); } @Override public void removeFromMap(BaiduMap baiduMap) { mapListener.removeMapStatusChangeListener(markerClusterManager); Log.i("OverlayCluster", "removeMapStatusChangeListener"); markerClusterManager = null; } public void addMarker(OverlayMarker marker) { if (markerClusterManager == null) { markers.add(marker); } else { markerClusterManager.addItem(marker); markerClusterManager.cluster(); } } public void removeMarker(OverlayMarker marker) { Log.i("OverlayCluster", "removeMarker, " + marker.getPosition().latitude + "," + marker.getPosition().longitude); markers.remove(marker); Log.i("OverlayCluster", "markers size: " + markers.size()); refresh(); } public void clearMarkers() { Log.i("OverlayCluster", "clearMarkers: " + markers.size()); markers.clear(); if (markerClusterManager != null) { markerClusterManager.clearItems(); } } public void setMapListener(MapListener mapListener) { this.mapListener = mapListener; } private void refresh() { if (markerClusterManager != null) { markerClusterManager.clearItems(); markerClusterManager.addItems(markers); markerClusterManager.cluster(); } } }