3

如何創建兩個偵聽器?一個用於羣集,另一個用於在地圖上不存在任何羣集項的情況下將新羣集項加載到地圖。我該如何製作兩個谷歌地圖監聽器? setOnCameraChangeListener

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

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

     // ifMarkesNotInsideMapReload... 

我認爲這是不可能的,但有人也許解決了這個...

一個想法是手動設置更改起始位置和poll ..不冷靜:-)

我米穀歌使用集羣庫:google cluster

回答

6

我已經調查ClusterManager實施AMUtils庫,它看起來像它在你的實現ClusterRenderer調用onCameraChange如果它也實現s 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 { 
+0

工作很好!雖然我不明白我是否需要/應該創建mRenderer變量..?因爲現在羣集不會出現(第一次),除非我放大/縮小一點點。我可以在地圖上調用一些刷新/重新渲染功能嗎? – bestKoderEverR

+0

我的集羣dident顯示的原因是因爲mycluster.cluster()重新集羣方法沒有在主線程上調用..所以擡頭:-) – bestKoderEverR

14

使用Composite Pattern創建一個類,這兩個一個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 
} 

然後在你的主類:

CompositeCameraChangeListener composite = new CompositeCameraChangeListener(); 
composite.add(mClusterManager); 
composite.add(new CameraChangeListner() { ... }); 
map.setOnCameraChangeListener(composite); 

現在被調用CompositeCameraChangeListener的方法時,它調用轉發給其他聆聽並儘可能您應用程序而言,您現在有兩個(或更多)聽衆註冊在一個旨在僅接受一個的對象上。

+0

看起來好像有一個單獨的類來處理攝像機事件。可以得心應手。 – bestKoderEverR

+0

真的很簡單=)thx適合我 –

+0

這是最好的解決方案。另外一個我實現的是將偵聽器添加到此處,並將事件重定向到所有偵聽器,與沒有中間類的那個類似。 – Franklin

4

對於那些掙扎在由跋涉上述僞代碼,你可以使用下面的代碼片段

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); 
1

包括集羣管理器onCameraChange在您的自定義相機變化聽衆

mMap.setOnCameraChangeListener(new OnCameraChangeListener() { 
    @Override 
    public void onCameraChange(CameraPosition cameraPosition) { 
     mClusterManager.onCameraChange(cameraPosition); 
     ..... 
    } 
}); 
相關問題