GoogleMap onCameraIdle事件未触发

时间:2016-11-26 07:39:31

标签: android google-maps

我试图在谷歌地图上聚类标记,因为地图上有太多标记(大约6000多个标记)。

所以我用Google搜索并找到了一些关于标记聚类的文档,并将其应用到我的源代码中,但是谷歌地图中没有显示标记。

FragMap片段的部分源代码。

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    SupportMapFragment map = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.display_map);
    if (map == null) {
        Log.e(Tag, "Google Map fragment(id: display_map) is null reference!");
        return;
    }

    map.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    if (DataPackage.getEQMarkerManager() == null) {
        if (!DataPackage.initializeEQMarkerManager(getActivity(), googleMap)) {
            Log.w(Tag, "EQMarkerManager initialization failure");
        }
    }
}

EQMarkerManager的部分源代码及其实现GoogleMap.OnCameraIdleListener接口。

public EQMarkerManager(Context ctx, GoogleMap map) {
    // ...
    clusterManager = new ClusterManager<>(ctx, map);
    clusterManager.setRenderer(new EQRenderer<>(ctx, map, clusterManager));

    map.setOnCameraIdleListener(this);

    clusterManager.addItems(markers);
}

@Override
public void onCameraIdle() {
    Log.d(Tag, "onCameraIdle");
}

但从未调用onCameraIdle回调。为什么OnCameraIdle事件没有触发?

的gradle:

compile 'com.google.android.gms:play-services-maps:9.8.0'
compile 'com.google.maps.android:android-maps-utils:0.4.4+'

在Marshmallow设备上测试(SDK版本23)。

已添加:gradle编译时+的含义是什么?

3 个答案:

答案 0 :(得分:3)

在一些有限的测试中,似乎v2版本的Google Maps API仅支持一个空闲事件监听器(即最后一个注册的监听器) - 所以其他一些代码是否也可以注册一个监听器?

所以,例如:

mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
    @Override
    public void onCameraIdle() {
        Log.e(TAG,"Listener 1");
    }
});
mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
    @Override
    public void onCameraIdle() {
        Log.e(TAG,"Listener 2");
    }
});

在上面的例子中,只看到“听众2”。 (对于setOnCameraMoveListener也是如此,所以我假设所有的地图相机事件都是这样的。

假设您克服了此限制,一个建议是将clusterManager实例添加为空闲相机侦听器 - ClusterManager实现GoogleMap.OnCameraIdleListener接口(即onCameraIdle方法)并有自己的逻辑来正确决定何时重新聚类。例如,它避免了在平移操作上的重新聚集(即,未改变变焦)。它还将事件传播给渲染器实现。

所以在OP代码中它将是

map.setOnCameraIdleListener(clusterManager);

如果必须看到该事件,则成为唯一已注册的侦听器,然后通过直接调用其onCameraIdle将该事件传播到集群管理器。

此外,gradle依赖项中的“+”表示任何版本“&gt; =”指定的版本满足依赖项。

答案 1 :(得分:1)

&#39; onCameraIdle&#39;事件没有解雇,因为我打电话给'setOnCameraIdleListener&#39;在另一堂课上。

我的问题的源代码

FragMap:

@Override
public void onMapReady(GoogleMap googleMap) {
    if (DataPackage.getEQMarkerManager() == null) {
        if (!DataPackage.initializeEQMarkerManager(getActivity(), googleMap)) {
            Log.w(Tag, "EQMarkerManager initialization failure");
        }
    }
}

EQMarkerManager:

public EQMarkerManager(Context ctx, GoogleMap map) {
    // ...
    clusterManager = new ClusterManager<>(ctx, map);
    clusterManager.setRenderer(new EQRenderer<>(ctx, map, clusterManager));

    map.setOnCameraIdleListener(this);

    clusterManager.addItems(markers);
}


initializeEQMarkerManager方法初始化EQMarkerManager类,EQMarkerManager#ctor调用setOnCameraIdleListener。 我不太了解android,所以我完全确定这些代码的工作原理。 但它不是:/

无论如何,我通过调用FragMap内的setOnCameraIdleListener解决了这个问题。

@Override
public void onMapReady(GoogleMap googleMap) {
    if (DataPackage.getEQMarkerManager() == null) {
        if (!DataPackage.initializeEQMarkerManager(getActivity())) {
            Log.w(Tag, "EQMarkerManager initialization failure");
            return;
        }
    }

    googleMap.setOnCameraIdleListener(DataPackage.getEQMarkerManager());
}

答案 2 :(得分:0)

'onCameraIdle'将不会触发,因为'setOnCameraIdleListener'是由ClusterManager类在内部调用的。所以我们可以做的就是

mmap.setOnCameraIdleListener(this);

在实现OnCameraIdleListener时

    @Override
    public void onCameraIdle() {
        clustermanager.onCameraIdle();
    }