/*
* Copyright (C) 2013 Maciej Górski
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package pl.mg6.android.maps.extensions.demo;
import android.graphics.Point;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.androidmapsextensions.ClusterGroup;
import com.androidmapsextensions.ClusteringSettings;
import com.androidmapsextensions.GoogleMap;
import com.androidmapsextensions.Marker;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.model.LatLng;
import java.util.List;
public class DeclusterificationExampleFragment extends BaseFragment {
private List<Marker> declusterifiedMarkers;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.simple_map, container, false);
}
@Override
protected void setUpMap() {
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.0, 19.0), 7.0f));
map.setClustering(new ClusteringSettings().clusterOptionsProvider(new DemoClusterOptionsProvider(getResources())));
MarkerGenerator.addMarkersInPoland(map);
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.isCluster()) {
declusterify(marker);
return true;
}
return false;
}
});
map.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng position) {
clusterifyMarkers();
}
});
}
private void declusterify(Marker cluster) {
clusterifyMarkers();
declusterifiedMarkers = cluster.getMarkers();
LatLng clusterPosition = cluster.getPosition();
double distance = calculateDistanceBetweenMarkers();
double currentDistance = -declusterifiedMarkers.size() / 2 * distance;
for (Marker marker : declusterifiedMarkers) {
marker.setData(marker.getPosition());
marker.setClusterGroup(ClusterGroup.NOT_CLUSTERED);
LatLng newPosition = new LatLng(clusterPosition.latitude, clusterPosition.longitude + currentDistance);
marker.animatePosition(newPosition);
currentDistance += distance;
}
}
private double calculateDistanceBetweenMarkers() {
Projection projection = map.getProjection();
Point point = projection.toScreenLocation(new LatLng(0.0, 0.0));
point.x += getResources().getDimensionPixelSize(R.dimen.distance_between_markers);
LatLng nextPosition = projection.fromScreenLocation(point);
return nextPosition.longitude;
}
private void clusterifyMarkers() {
if (declusterifiedMarkers != null) {
for (Marker marker : declusterifiedMarkers) {
LatLng position = marker.getData();
marker.setPosition(position);
marker.setClusterGroup(ClusterGroup.DEFAULT);
}
declusterifiedMarkers = null;
}
}
}