2016-11-26 107 views
2

我試圖在谷歌地圖上聚集標記,因爲地圖上有太多標記(大約有6000多個標記)。谷歌地圖onCameraIdle事件沒有觸發

因此,我搜索了一些關於標記聚類的文檔,並將其應用於我的源代碼,但標記未顯示在Google地圖中。

部分源代碼FragMap片段。

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    SupportMapFragment map = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.display_map); 
    if (map == null) { 
     Log.e(Tag, "Google Map fragment(id: display_map) is null reference!"); 
     return; 
    } 

    map.getMapAsync(this); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    if (DataPackage.getEQMarkerManager() == null) { 
     if (!DataPackage.initializeEQMarkerManager(getActivity(), googleMap)) { 
      Log.w(Tag, "EQMarkerManager initialization failure"); 
     } 
    } 
} 

EQMarkerManager部分源代碼和它的實現GoogleMap.OnCameraIdleListener接口。

public EQMarkerManager(Context ctx, GoogleMap map) { 
    // ... 
    clusterManager = new ClusterManager<>(ctx, map); 
    clusterManager.setRenderer(new EQRenderer<>(ctx, map, clusterManager)); 

    map.setOnCameraIdleListener(this); 

    clusterManager.addItems(markers); 
} 

@Override 
public void onCameraIdle() { 
    Log.d(Tag, "onCameraIdle"); 
} 

onCameraIdle回調從來沒有叫。爲什麼OnCameraIdle事件不會觸發?

的gradle:

compile 'com.google.android.gms:play-services-maps:9.8.0' 
compile 'com.google.maps.android:android-maps-utils:0.4.4+' 

測試棉花糖設備(SDK版本23)上。

ADDED+對gradle編譯有什麼含義?

+0

您是否收到過錯誤信息?你可能會錯過什麼。查看展示事件監聽器的示例代碼:https://developers.google.com/maps/documentation/android-api/events#code_samples –

+0

@ d.datul1990感謝您的關注,但不幸的是我沒有收到任何錯誤消息:/ – SlaneR

回答

0

'onCameraIdle'事件沒有觸發,因爲我在另一個類上調用了「setOnCameraIdleListener」。從我的問題

的源代碼

FragMap:

@Override 
public void onMapReady(GoogleMap googleMap) { 
    if (DataPackage.getEQMarkerManager() == null) { 
     if (!DataPackage.initializeEQMarkerManager(getActivity(), googleMap)) { 
      Log.w(Tag, "EQMarkerManager initialization failure"); 
     } 
    } 
} 

EQMarkerManager:

public EQMarkerManager(Context ctx, GoogleMap map) { 
    // ... 
    clusterManager = new ClusterManager<>(ctx, map); 
    clusterManager.setRenderer(new EQRenderer<>(ctx, map, clusterManager)); 

    map.setOnCameraIdleListener(this); 

    clusterManager.addItems(markers); 
} 


initializeEQMarkerManager方法做初始化EQMarkerManager類和EQMarkerManager#構造函數調用setOnCameraIdleLi斯特納。 我對android並不瞭解,所以我完全確信這些代碼的作品。 但它不是:/

無論如何,我通過調用FragMap內的setOnCameraIdleListener來解決此問題。

@Override 
public void onMapReady(GoogleMap googleMap) { 
    if (DataPackage.getEQMarkerManager() == null) { 
     if (!DataPackage.initializeEQMarkerManager(getActivity())) { 
      Log.w(Tag, "EQMarkerManager initialization failure"); 
      return; 
     } 
    } 

    googleMap.setOnCameraIdleListener(DataPackage.getEQMarkerManager()); 
} 
2

在一些有限的測試中,Google Maps API的v2版本似乎只支持一個空閒事件偵聽器(即最後註冊的偵聽器) - 那麼其他代碼是否也可以註冊偵聽器?

因此,舉例來說:

mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { 
    @Override 
    public void onCameraIdle() { 
     Log.e(TAG,"Listener 1"); 
    } 
}); 
mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { 
    @Override 
    public void onCameraIdle() { 
     Log.e(TAG,"Listener 2"); 
    } 
}); 

在上面的例子中,僅「監聽器2」 見過。 (這也是爲setOnCameraMoveListener真實,所以我會承擔所有的地圖相機事件這樣的行爲

假設你克服這個限制,一個建議是在clusterManager實例添加爲空閒相機聽衆 - 在ClusterManager工具(例如onCameraIdle方法),並具有自己的邏輯,用於正確決定何時重新集羣。例如,它避免了平移操作上的重新聚集(即縮放沒有改變),它還將事件傳播給渲染器實現。

所以在OP代碼這將是

map.setOnCameraIdleListener(clusterManager); 

如果您必須查看該事件,則成爲唯一註冊的偵聽器,然後通過直接調用onCameraIdle將事件傳播到集羣管理器。

另外,gradle依賴項中的'+'表示任何版本「> =」指定的版本滿足依賴關係。

+0

非常感謝,現在我瞭解了gra +中的+符號:) 順便說一句,onCameraIdle事件沒有被解僱,因爲它是由另一個類設置的。 – SlaneR