如何创建两个侦听器?一个用于群集,另一个用于将新的群集项加载到地图中,如果地图上不存在群集项。
//needed for clustering
map.setOnCameraChangeListener(mClusterManager);
// need for loading clusteritems
map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
// ifMarkesNotInsideMapReload...
我认为这不可能,但有人可能会解决这个问题......
一个想法是设置一个起始位置并手动轮询更改。不酷: - )
我正在使用googles群集库:google cluster
答案 0 :(得分:15)
使用Composite Pattern创建一个 一个CameraChangeListener
和包含 CameraChangeListener
的类,这样它就可以了被设置为地图上唯一的监听者,同时委托多个做实际工作的孩子。
在这种情况下,您将创建一个CompositeCameraChangeListener
类,该类实现CameraChangeListener
接口并维护它所委托的子侦听器列表。
一些伪代码:
public class CompositeCameraChangeListener implements CameraChangeListener {
private final List<CameraChangeListener> mListeners = new ArrayList<CameraChangeListener>();
@Override
public void onCameraChange(CameraPosition position) {
for (CameraChangeListener listener in mListeners) {
listener.onCameraChange(position);
}
}
// Other methods to add, remove listeners
}
然后在你的主要课程中:
CompositeCameraChangeListener composite = new CompositeCameraChangeListener();
composite.add(mClusterManager);
composite.add(new CameraChangeListner() { ... });
map.setOnCameraChangeListener(composite);
现在,当调用CompositeCameraChangeListener
的方法时,它会将调用转发给其他侦听器,就您的应用而言,您现在在设计的对象上注册了两个(或更多)侦听器只接受一个。
答案 1 :(得分:6)
我已经查看了ClusterManager
AMUtils库的实现,如果它还实现了onCameraChange
,它看起来就会在ClusterRenderer
的实现上调用OnCameraChangeListener
。只需使其实现该接口即可。
代码的相关部分:
@Override
public void onCameraChange(CameraPosition cameraPosition) {
if (mRenderer instanceof GoogleMap.OnCameraChangeListener) {
((GoogleMap.OnCameraChangeListener) mRenderer).onCameraChange(cameraPosition);
}
如果您使用的是DefaultClusterRendeder
,请创建一个类:
public class MyClusterRenderer extends DefaultClusterRenderer implements OnCameraChangeListener {
答案 2 :(得分:4)
对于那些在TreKing上遇到上述伪代码的人,你可以使用下面的代码片段
public class MultiListener implements GoogleMap.OnCameraChangeListener {
private List<GoogleMap.OnCameraChangeListener> mListeners = new ArrayList<GoogleMap.OnCameraChangeListener>();
public void registerListener (GoogleMap.OnCameraChangeListener listener) {
mListeners.add(listener);
}
@Override
public void onCameraChange(CameraPosition cameraPosition)
{
for (GoogleMap.OnCameraChangeListener ccl: mListeners)
{
ccl.onCameraChange(cameraPosition);
}
}
}
并添加到MultiListener
MultiListener ml = new MultiListener();
ml.registerListener(mClusterManager);
ml.registerListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
// code here
}
}
);
map.setOnCameraChangeListener(ml);
答案 3 :(得分:1)
在自定义相机更改侦听器中包含集群管理器onCameraChange
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
mClusterManager.onCameraChange(cameraPosition);
.....
}
});
答案 4 :(得分:0)
自setOnCameraChangeListener is deprecated起,最好使用 setOnCameraIdleListener
map.setOnCameraIdleListener {
//...
clusterManager.onCameraIdle()
}