简体   繁体   English

使用android-maps-utils禁用最大缩放级别的群集

[英]Disable clustering at max zoom level using android-maps-utils

I'm new here, so any feedback is welcome. 我是新来的,所以欢迎任何反馈。 I'm trying to use a DefaultClusterRenderer to show some custom clusters, and I'm trying to get it not to cluster when the map is fully zoomed in. So I found this answer to the exact same question: Disable clustering at max zoom level with Googles android-maps-utils so I tried that code, but I'm getting a Not on the main thread error. 我正在尝试使用DefaultClusterRenderer来显示一些自定义群集,并且我试图在地图完全放大时不让它聚集。所以我找到了完全相同问题的答案: 在最大缩放级别禁用聚类与谷歌android-maps-utils所以我尝试了该代码,但我得到一个不在主线程错误。 Any help will be greatly appreciated. 任何帮助将不胜感激。 I have this in my constructor 我在我的构造函数中有这个

public EspecieRenderer(Context context, GoogleMap map, ClusterManager<T> clusterManager) {
    super(context, map, clusterManager);
    this.mMap = map;
...
}

and then I'm doing 然后我在做

@Override
protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
    final float currentZoom = mMap.getCameraPosition().zoom;
    final float currentMaxZoom = mMap.getMaxZoomLevel();
    return currentZoom < currentMaxZoom && cluster.getSize() >= 10;
}

Here is how I'm initializing the cluster. 这是我正在初始化集群的方式。 I'm using threads because I have close to 200 species to load, each with one or more markers to add to the map 我正在使用线程,因为我有近200种物种需要加载,每个物种都有一个或多个标记要添加到地图中

private void setUpClusterer() {
    clusterManager = new ClusterManager<>(this, googleMap);
    clusterManager.setRenderer(new EspecieRenderer<>(this, googleMap, clusterManager));
    googleMap.setOnCameraChangeListener(clusterManager);
    googleMap.setOnMarkerClickListener(clusterManager);
    ArrayList<Especie> especies = (ArrayList<Especie>) Especie.list(this);
    for (Especie especie : especies) {
        ExecutorService queue = Executors.newSingleThreadExecutor();
        queue.execute(new EspecieLoader(this, especie));
    }
}

Where EspecieLoader EspecieLoader

public class EspecieLoader implements Runnable {
    private MainActivity context;
    private Especie especie;

    public EspecieLoader(MainActivity mainActivity, Especie especie) {
        this.context = mainActivity;
        this.especie = especie;
    }

    @Override
    public void run() {
        List<Foto> fotos = Foto.findAllByEspecieWithdCoords(context, especie);
        String nombre = especie.getNombreCientifico();
        for (Foto foto : fotos) {
            LatLng latLng = new LatLng(foto.getLatitud(), foto.getLongitud());
            Bitmap bitmap;
            String path = "new/" + foto.getPath().replaceAll("-", "_").toLowerCase();
            try {
                bitmap = ResourcesHelper.getEncyclopediaAssetByName(context, path);
                EspecieMarker especieMarker = new EspecieMarker(nombre, bitmap, latLng);
                context.addSpeciesMarker(especieMarker);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

I'm getting this when I try to run my app: 当我尝试运行我的应用时,我得到了这个:

07-16 19:18:41.402 31151-32075/com.lzm.Cajas E/AndroidRuntime: FATAL EXCEPTION: Thread-47332
Process: com.lzm.Cajas, PID: 31151
java.lang.IllegalStateException: Not on the main thread
    2at maps.f.g.b(Unknown Source)
    at maps.z.F.a(Unknown Source)
    at maps.af.t.a(Unknown Source)
    at vl.onTransact(:com.google.android.gms.DynamiteModulesB:51)
    at android.os.Binder.transact(Binder.java:387)
    at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.getCameraPosition(Unknown Source)
    at com.google.android.gms.maps.GoogleMap.getCameraPosition(Unknown Source)
    at com.lzm.Cajas.map.EspecieRenderer.shouldRenderAsCluster(EspecieRenderer.java:62)
    at com.google.maps.android.clustering.view.DefaultClusterRenderer$RenderTask.run(DefaultClusterRenderer.java:416)
    at java.lang.Thread.run(Thread.java:818)

I've run into the same need just today. 我今天遇到了同样的需求。 This is my solution: Since you can't set setOnCameraChangeListener twice, remove 这是我的解决方案:由于您无法设置setOnCameraChangeListener两次,因此请删除

googleMap.setOnCameraChangeListener(clusterManager);

and replace it with 并替换它

googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            shouldCluster_zoom = cameraPosition.zoom < 9; //disables the cluster at 9 and higher zoom levels
            clusterManager.onCameraChange(cameraPosition); //Replaces googleMap.setOnCameraChangeListener(clusterManager);
        }
    });

" shouldCluster_zoom " obviously is a global variable, static and boolean. shouldCluster_zoom ”显然是一个全局变量,静态和布尔值。 Now in " shouldRenderAsCluster " method check, according to the zoom, if markers should be clustered: 现在在“ shouldRenderAsCluster ”方法中检查,根据缩放,是否应该聚类标记:

    @Override
    protected boolean shouldRenderAsCluster(Cluster<T> cluster) {
        return super.shouldRenderAsCluster(cluster) && Your_class_name.shouldCluster_zoom;
    }

Editing on top of @Alberto97's answer: 在@ Alberto97的答案之上编辑:

OnCameraChange method is now deprecated. OnCameraChange方法现已弃用。 They replaced GoogleMap.OnCameraChangeListener() with three camera listeners : 他们用三个摄像头监听器取代了GoogleMap.OnCameraChangeListener():

  • GoogleMap.OnCameraMoveStartedListener - Callback interface for when the camera motion starts. GoogleMap.OnCameraMoveStartedListener - 摄像机动作开始时的回调界面。
  • GoogleMap.OnCameraMoveListener - Callback interface for when the camera changes position. GoogleMap.OnCameraMoveListener - 相机更改位置时的回调界面。
  • GoogleMap.OnCameraIdleListener - Callback interface for when camera movement has ended. GoogleMap.OnCameraIdleListener - 相机移动结束时的回调界面。

I would use OnCameraIdleListener 我会使用OnCameraIdleListener

  googleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
            @Override
            public void onCameraIdle() {
                shouldCluster_zoom = cameraPosition.zoom < 9;
                clusterManager.onCameraIdle();
            }
        });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM