5

如何创建两个侦听器?一个用于聚类,另一个将在地图上不存在聚类项目时将新的聚类项目加载到地图。

       //needed for clustering
       map.setOnCameraChangeListener(mClusterManager);

       // need for loading clusteritems
       map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
       @Override
       public void onCameraChange(CameraPosition position) {

       // ifMarkesNotInsideMapReload...

我认为这是不可能的,但有人可能解决了这个问题......

一个想法是设置起始位置并手动轮询更改..不酷:-)

我正在使用谷歌集群库:谷歌集群

4

5 回答 5

15

使用复合模式创建一个既是 a 又包含 s 的类这样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调用 's 方法时,它将调用转发给其他侦听器,并且就您的应用而言,您现在在一个设计为仅接受一个的对象上注册了两个(或更多)侦听器。

于 2014-02-03T06:02:13.453 回答
7

我研究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 {
于 2014-01-31T15:42:46.877 回答
6

对于那些在 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);
于 2015-05-26T06:44:10.817 回答
1

在您的自定义相机更改侦听器中包含集群管理器 onCameraChange

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        mClusterManager.onCameraChange(cameraPosition);
        .....
    }
});
于 2016-03-30T08:15:18.630 回答
0

由于不推荐使用setOnCameraChangeListener,因此最好使用setOnCameraIdleListener

map.setOnCameraIdleListener {
    //...
    clusterManager.onCameraIdle()
}
于 2020-04-30T13:48:29.800 回答