Android Utility Libraryの一つであるClusterManagerを使ってみました。
これを使って位置登録で地図にあふれ出たマーカーを
ズームアウトすると、周辺のマーカーを吸収してひとまとめに
して表示してくれます。
撮った写真を地図に逐次追加したいアプリに向いていますね。
追加方法は、まずClusterModelを作ります。
</pre> public class ClusterModel implements ClusterItem { private LatLng mPosition; private String mTitle; private String mSnippet; public ClusterModel(double lat, double lng, String title, String snippet) { mPosition = new LatLng(lat, lng); mTitle = title; mSnippet = snippet; } @Override public LatLng getPosition() { return mPosition; } @Override public String getTitle() { return mTitle; } @Override public String getSnippet() { return mSnippet; } } <pre>
続いて表示したいアクティビティに次のように書きます。
</pre> private ClusterManager<ClusterModel> mClusterManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_report); } @Override public void onMapReady(GoogleMap googleMap) { mClusterManager = new ClusterManager<ClusterModel>(this, mMap); mMap.setOnCameraIdleListener(mClusterManager); mMap.setOnMarkerClickListener(mClusterManager); for(int i =0; i < points.size(); i++) { ClusterModel offsetItem = new ClusterModel(pointX[i], pointY[i],title[i],url[i]); mClusterManager.addItem(offsetItem); } } mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { return null; } @Override public View getInfoContents(Marker marker) { View view = getLayoutInflater().inflate(R.layout.info_window, null); TextView title = (TextView)view.findViewById(R.id.info_title); title.setText(marker.getTitle()); ImageView imageView = (ImageView) view.findViewById(R.id.info_image); Picasso.with(ReportActivity.this) .load(marker.getSnippet()) .placeholder(R.drawable.sample) .resize(200,200) .into(imageView,new MarkerCallback(marker,marker.getSnippet(),imageView)); return view; } <pre>
ClusterModelインスタンスで定義した緯度経度・タイトル・urlを
順に出していきたいためforで回しています。
画像を出したい時はまたpicassoで読み込んでいきます。
複雑になってしまいましたがこれで晴れてクラスターを使えるように
なりました。