1

我已经在我的应用程序的 iOS 版本上实现了 Google Maps Clustering,它运行良好。我现在正在尝试使用 android maps 实用程序库在 Android 版本上实现 Clustering,当我放大或缩小时它不是 Declustering/Clustering。

这是集群项目类:

public class MyClusterItem implements ClusterItem {

    private final LatLng position;
    private final BitmapDescriptor icon;
    private final String tag;

    public MyClusterItem(double lat, double lng, BitmapDescriptor icon, String tag) {
        this.position = new LatLng(lat, lng);
        this.icon = icon;
        this.tag = tag;
    }
    @Override
    public LatLng getPosition() {
        return position;
    }

    @Override
    public String getTitle() {
        return null;
    }

    @Override
    public String getSnippet() {
        return null;
    }

    public BitmapDescriptor getIcon() {
        return icon;
    }

    public String getTag() {
        return tag;
    }
}

以下是集群管理器的实现方式:

public void onMapReady(GoogleMap googleMap) {
        //Log.i ( TAG, "Google Map Ready Callback" );
        mMap = googleMap;
        //mMap.setOnMarkerClickListener(this);
        // Point the map's listeners at the listeners implemented by the cluster
        // manager.
        mMap.setOnCameraIdleListener(mClusterManager);
        mMap.getUiSettings().setMapToolbarEnabled(false);
        mMap.getUiSettings().setMyLocationButtonEnabled(false);
        mMap.getUiSettings().setRotateGesturesEnabled(false);
        if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && isLocationEnabled) {
            mMap.setMyLocationEnabled(true);
        }
        float mCurrentZoom = googleMap.getCameraPosition().zoom;
        // Initialize the manager with the context and the map.
        // (Activity extends context, so we can pass 'this' in the constructor.)
        mClusterManager = new ClusterManager<MyClusterItem>(this, mMap);
        mClusterManager.setOnClusterItemClickListener(mClusterItemClickListener);
        mMap.setOnMarkerClickListener(mClusterManager);
        mClusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<MyClusterItem>() {
            @Override
            public boolean onClusterClick(final Cluster<MyClusterItem> cluster) {
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                        cluster.getPosition(), (float) Math.floor(mMap
                                .getCameraPosition().zoom + 1)), 300,
                        null);
                return true;
            }
        });
    }

集群项是从 Firebase 数据库中添加的,如下所示:

markerRef.addChildEventListener(new ChildEventListener() {
   @Override
   public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      try {
         tableCount = tableCount+1;
         markerKey = dataSnapshot.getKey();
         markerData = dataSnapshot.getValue(Markers.class);
         MyClusterItem markerItem = new PicNickClusterItem(markerData.y, markerData.x,      BitmapDescriptorFactory.fromResource(R.drawable.verified), markerKey);
         mClusterItemMap.put(markerKey, markerItem);
         mClusterManager.addItem(markerItem);
         if(tableCount >= numTables) {
            //cluster markers
            mClusterManager.cluster();
         }
      } catch (Error error) {
         noFirebaseAccessAlert();
      }
   }
}

初始地图截图:

在此处输入图像描述

缩小时的屏幕截图:

在此处输入图像描述

放大时的屏幕截图:

在此处输入图像描述

缩小/缩小时集群项目没有被集群/去集群并且没有动画。当我缩小时,我希望集群项目移动到集群中,并且当我放大集群项目以与集群分离时,就像它们在应用程序的 iOS 版本中所做的那样。此外,当我点击集群标记时,地图会放大,但集群不会扩展到集群项目。没有一个集群项目具有相同的 lat/lng 并且相隔很远。

在 iOS 版本中,我能够设置算法(非基于分层距离)和几个用于聚类的“桶”(并为每个桶指定自定义图标)。我需要两个版本的外观和响应相同,以便用户在 iOS 和 Android 设备上拥有相同的体验。

4

0 回答 0