2016-11-26 10 views
2

マップ上にマーカーが多すぎるため(約6000+マーカー)、マーカーをGoogleマップにクラスタリングしようとしています。GoogleMap 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:マシュマロ装置(SDKバージョン23)でテスト

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

ADDED+はgradleコンパイルの意味は?

+0

エラーメッセージが表示されましたか?あなたは何かを見逃すかもしれない。ここでイベントリスナーを示すサンプルコードを確認してください:https://developers.google.com/maps/documentation/android-api/events#code_samples –

+0

@ d.datul1990ご協力いただきありがとうございますが、残念ながらエラーはありませんメッセージ:/ – SlaneR

答えて

0

別のクラスで 'setOnCameraIdleListener'を呼び出したため、 'onCameraIdle'イベントが発生しませんでした。

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

EQMarkerManager:私の質問

FragMapから

ソースコード

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#のctorの呼び出しを初期化しsetOnCameraIdleLiステアー。 アンドロイドについてよく分かりませんので、私はこれらのコードの動作について完全に確信しています。 しかし、そうではありませんでした:/

とにかく、私は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

いくつかの限られたテストでは、v2バージョンのGoogle Maps APIはアイドルイベントリスナー(つまり最後に登録されたリスナー)のみをサポートしているようです - 他のコードもリスナーを登録する可能性がありますか?

ので、例えば上記の例では

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についても同様ですので、私はすべてのマップカメライベントがこのように振る舞うと仮定したい

あなたはこの制限を克服すると仮定すると、1つの提案は、アイドル状態のカメラリスナーとしてclusterManagerインスタンスを追加することです - ClusterManager実装GoogleMap.OnCameraIdleListenerインターフェイス(すなわちonCameraIdleメソッド)であり、再クラスタリングをいつ行うかを適切に決定する独自のロジックを持っています。たとえば、パン操作での再クラスタリング(つまり、ズームは変更されません)を避けます。

だから、OPコードで、それは次のようになり

map.setOnCameraIdleListener(clusterManager); 

イベントを表示する必要がある場合は、唯一登録されているリスナーになり、onCameraIdleを直接呼び出すことによってイベントをクラスタ・マネージャに伝播します。

また、グラデルの依存関係の '+'は、指定されたバージョンが> = "任意のバージョンを示しています。

+0

ありがとう、グラデーションの+シンボルについて理解しています:) 別のクラスによって設定されたため、BTW、onCameraIdleイベントが発生しませんでした。 – SlaneR

関連する問題