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

bes*_*erR 3 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...
Run Code Online (Sandbox Code Playgroud)

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

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

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

dom*_*der 15

使用复合模式创建一个类,无论CameraChangeListener CameraChangeListener S,使得它可以在地图上,同时委托给多的孩子,做实际工作设置为唯一的听众.

在这种情况下,您将创建一个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
}
Run Code Online (Sandbox Code Playgroud)

然后在你的主要课程:

CompositeCameraChangeListener composite = new CompositeCameraChangeListener();
composite.add(mClusterManager);
composite.add(new CameraChangeListner() { ... });
map.setOnCameraChangeListener(composite);
Run Code Online (Sandbox Code Playgroud)

现在,当CompositeCameraChangeListener调用方法时,它会将调用转发给其他侦听器,就您的应用而言,您现在有两个(或更多)侦听器在一个仅被接受的对象上注册.


Mac*_*ski 7

我已经研究ClusterManager了AMUtils库的实现,看起来它调用onCameraChange了它的实现,ClusterRenderer如果它也实现了OnCameraChangeListener.只需使其实现该接口即可.

代码的相关部分:

@Override
public void onCameraChange(CameraPosition cameraPosition) {
    if (mRenderer instanceof GoogleMap.OnCameraChangeListener) {
        ((GoogleMap.OnCameraChangeListener) mRenderer).onCameraChange(cameraPosition);
    }
Run Code Online (Sandbox Code Playgroud)

如果您正在使用DefaultClusterRendeder,请创建一个类,如:

public class MyClusterRenderer extends DefaultClusterRenderer implements OnCameraChangeListener {
Run Code Online (Sandbox Code Playgroud)


Bih*_*eng 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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

并添加到 MultiListener

MultiListener ml = new MultiListener();
ml.registerListener(mClusterManager);
ml.registerListener(new GoogleMap.OnCameraChangeListener() {
               @Override
               public void onCameraChange(CameraPosition cameraPosition) {

                 // code here
               }
           }
    );
map.setOnCameraChangeListener(ml);
Run Code Online (Sandbox Code Playgroud)