我怎样才能制作两个谷歌地图听众? setOnCameraChangeListener

时间:2014-01-31 14:48:35

标签: android google-maps cluster-computing android-maps-utils

如何创建两个侦听器?一个用于群集,另一个用于将新的群集项加载到地图中,如果地图上不存在群集项。

       //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

5 个答案:

答案 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()
}