我试图在谷歌地图上聚类标记,因为地图上有太多标记(大约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编译时+
的含义是什么?
答案 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();
}