рдЧреВрдЧрд▓ рдореИрдкреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ

рдпрджрд┐ рдЖрдк Google рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╛рдИрдВ рдУрд░ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░, рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджрд╛рдИрдВ рдУрд░ рдХреА рддрд╕реНрд╡реАрд░ рдмреЗрд╣рддрд░ рджрд┐рдЦрддреА рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдЖрдк рд╣реИрдВред



рдЫрд╡рд┐



рдЗрд╕рд▓рд┐рдП, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВ:



рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдХреНрдпрд╛ рд╣реИ? рдЬрд╡рд╛рдм рд╣реИ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧред рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХрдИ рд╕рдЬрд╛рддреАрдп рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ, рдЬрд┐рд╕реЗ рдХреБрдЫ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рдХреНрд╖реЗрддреНрд░реАрдп рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдорд╛рд░реНрдХрд░ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрд▓рд╛рд╡рд╛, Google Google рдореИрдкреНрд╕ рдПрдВрдбреНрд░реЙрдЗрдб рдорд╛рд░реНрдХрд░ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдПрдХ рдЕрджреНрднреБрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрд▓рдЧ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдорд╛рд░реНрдХрд░реЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред



рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрдм рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рд░реНрдХрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдЖрдЗрдХрди рдФрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреНрд░рд┐рдпрд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рда рдХреЗ рд╕рд╛рде рдЗрдиреНрдлреЛрд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ)ред

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝рдиреЗ рдХреА рдХрд┐рд╕реЗ рдкрд░рд╡рд╛рд╣ рд╣реИ
developers.google.com/maps/articles/toomanymarkers?hl=ru

developers.google.com/maps/documentation/android/utility/marker-clustering

github.com/googlemaps/android-maps-utils





рдХрд╛рд░реНрдп


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рд╣реИрдВ: рд╣рдореЗрдВ рдПрдХ рд╡рд┐рддрд░рдг рдиреЗрдЯрд╡рд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХрдИ рдмрд┐рдВрджреБ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЯреНрд░рдХ рдорд╛рд▓ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВред рдЯреНрд░рдХреЛрдВ рдФрд░ рдЖрдЙрдЯрд▓реЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЯреНрд░рдХ рдорд╛рд░реНрдХрд░реЛрдВ рдореЗрдВ рдЪрд╛рд▓рдХ рдХреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдЗрдХрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧреНрд░рд╛рд╣рдХ рдЧрдВрднреАрд░ рд╣реИ, рдЙрд╕рдиреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдПрдХ рддрд╕реНрд╡реАрд░ рджреЗрдЦреА рдФрд░ рдХрд╣рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВред



рдЪрд░рдг 1. рддреИрдпрд╛рд░реА


рдкрд╣рд▓рд╛ рдХрджрдо рдмрд╣реБрдд рддрд╛рд░реНрдХрд┐рдХ рд╣реИ - рдЖрдкрдХреЛ рдЕрдореВрд░реНрдд рдорд╛рд░реНрдХрд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдиреНрдп рд╕рднреА рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ред рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рд░реНрдХрд░ рд╡рд░реНрдЧ рдХреЛ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ ClusterItem рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рд╕рд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рдХреЛрдб:



public abstract class AbstractMarker implements ClusterItem { protected double latitude; protected double longitude; protected MarkerOptions marker; @Override public LatLng getPosition() { return new LatLng(latitude, longitude); } protected AbstractMarker(double latitude, double longitude) { setLatitude(latitude); setLongitude(longitude); } @Override public abstract String toString(); public abstract MarkerOptions getMarker() { return marker; } public void setMarker(MarkerOptions marker) { this.marker = marker; } //others getters & setters }
      
      







рдЕрдЧрд▓рд╛ рдкреЙрдЗрдВрдЯ-рдСрдл-рд╕реЗрд▓ рдФрд░ рдЯреНрд░рдХ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪрд╛рдирдХ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред



TradeMarker, TruckMarker
 public class TradeMarker extends AbstractMarker { private static BitmapDescriptor shopIcon = null; private String description; public TradeMarker(String description, double latitude, double longitude) { super(latitude, longitude); setDescription(description); setBitmapDescriptor(); setMarker(new MarkerOptions() .position(new LatLng(getLatitude(), getLongitude())) .title("") .icon(shopIcon)); } public static void setBitmapDescriptor() { if (shopIcon == null) shopIcon = BitmapDescriptorFactory. fromResource(R.drawable.trademarker); } public String toString() { return "Trade place: " + getDescription(); } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } }
      
      







 public class TruckMarker extends AbstractMarker { private String name; private String aim; public TruckMarker(String name, String aim, double latitude, double longitude, BitmapDescriptor photo) { super(latitude, longitude); setName(name); setAim(aim); setMarker(new MarkerOptions() .position(new LatLng(getLatitude(), getLongitude())) .title("") .icon(photo)); } public String toString() { return "Name: " + getName() + "\n" + "Aim: " + getAim(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAim() { return aim; } public void setAim(String aim) { this.aim = aim; } }
      
      









рдЪрд░рдг 2. рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ


рдЦреИрд░, рддреИрдпрд╛рд░реА рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ, рдЕрдм рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ClusterManager рд╡рд░реНрдЧ, рдЬреЛ рдЖрдкрдХреЛ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред ClusterManager рд╡рд░реНрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ ClusterItem рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдХреЗ рджреМрд░рд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн рдФрд░ GoogleMap рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред



рддреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:



 private ClusterManager<AbstractMarker> clusterManager; //... clusterManager = new ClusterManager<AbstractMarker>(this.getApplicationContext(), getMap());
      
      





рдФрд░ рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд▓рд╕реНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ Manager.addItem (AbstractMarker рдорд╛рд░реНрдХрд░) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рд░реНрдХрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ ; ред



ClusterManager рд╡рд░реНрдЧ рдХреА рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдХреНрд▓рд╕реНрдЯрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк reclusterization (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж) рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреИрдорд░реЗ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреЗ рд╕рдордп (рдЬрд╝реВрдо рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп) рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдСрдирдХреИрдорд░рд╛рдЪреЗрдВрдЬ рд▓рд╛рдЗрд╕реНрдЯрдирд░ рд╣реИрдВрдбрд▓рд░ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



 map.setOnCameraChangeListener(clusterManager);
      
      







рдЦреИрд░, рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдб рд▓рдЧрднрдЧ рд╕реБрдВрджрд░ рд╣реИред рд▓рдЧрднрдЧ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдорд╛рд░реНрдХрд░ рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ , рдФрд░ рдЬрдм рдЖрдк рдорд╛рд░реНрдХрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ InfoWindowAdapter рд▓рд┐рдЦрд╛ рд╣реЛред рдЕрдм рд╣рдо рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред



рдЪрд░рдг 3. рдПрд▓реНрдЧреЛрд░рд┐рджрдо


рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╡рд┐рднрд┐рдиреНрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ, 2 рдореБрдЦреНрдп рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рдЧреНрд░рд┐рдб-рдЖрдзрд╛рд░рд┐рдд рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ - рдирдХреНрд╢реЗ рдХреЗ рджреГрд╢реНрдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рд╡рд░реНрдЧ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред









рджреВрд░реА-рдЖрдзрд╛рд░рд┐рдд рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИред рдорд╛рд░реНрдХрд░реЛрдВ рдХреЗ рдЙрдЪреНрдЪрддрдо рдПрдХрд╛рдЧреНрд░рддрд╛ рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░; рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛рдПрдБ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред









рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рд▓реА рдЧрдИ рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд▓рд┐рдП Google рдореБрдЭ рдкрд░ рдЕрдкрд░рд╛рдз рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред



рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред



рдЪрд░рдг 4. рдХреНрд▓рд╕реНрдЯрд░ рдореИрдирдЬрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рдирд╛


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреА рддрд╕реНрд╡реАрд░реЗрдВ рдорд╛рдирдХ рдорд╛рд░реНрдХрд░реЛрдВ рдореЗрдВ рдмрджрд▓ рдЧрдИрдВред рдЖрджреЗрд╢ рдирд╣реАрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ (рдФрд░ рдЕрдзрд┐рдХ) рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдХреНрд▓рд╕реНрдЯрд░ рдореИрдирдЬрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╕реЗрдЯрд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд▓рд╕реНрдЯрд░ / рдорд╛рд░реНрдХрд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдЧрд╛ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, DefaultClusterRenderer рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЪрд┐рдкреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдирд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛:



 public class OwnIconRendered extends DefaultClusterRenderer<AbstractMarker> { public OwnIconRendered(Context context, GoogleMap map, ClusterManager<AbstractMarker> clusterManager) { super(context, map, clusterManager); } @Override protected void onBeforeClusterItemRendered(AbstractMarker item, MarkerOptions markerOptions) { markerOptions.icon(item.getMarker().getIcon()); } }
      
      





рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдореИрдиреЗрдЬрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:



 clusterManager.setRenderer(new OwnIconRendered( getApplicationContext(), getMap(), clusterManager));
      
      







рдореБрдЭреЗ рдХреЗрд╡рд▓ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЗ рдЖрдЗрдХрди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЗрд╡рд▓ onBeforeClusterItemRendered рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреНрд▓рд╕реНрдЯрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдкрд╕рдВрдж рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ:







рдПрдХ рдЕрд▓рдЧ рддрдереНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдорд╛рд░реНрдХрд░рдореИрди рдХреНрд▓рд╛рд╕ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдорд╛рд░реНрдХрд░реЛрдВ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред



рдФрд░ рдЪрд▓реЛ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ: рдорд╛рд░реНрдХрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдо рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдЯреНрд░реАрдВрдЧ рд╡рд┐рдзрд┐ (рд╣рдордиреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХрд┐рддрдиреЗ рдЖрдЙрдЯрд▓реЗрдЯ рдФрд░ рдЯреНрд░рдХ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЪрдпрдирд┐рдд рдорд╛рд░реНрдХрд░ рдФрд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



 private AbstractMarker chosenMarker; private Cluster<AbstractMarker> chosenCluster;
      
      







рдЖрдкрдХреЛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдореИрди рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:



 clusterManager.setOnClusterItemClickListener(new ClusterManager.OnClusterItemClickListener<AbstractMarker>() { @Override public boolean onClusterItemClick(AbstractMarker item) { chosenMarker = item; return false; } }); clusterManager.setOnClusterClickListener(new ClusterManager.OnClusterClickListener<AbstractMarker>() { @Override public boolean onClusterClick(Cluster<AbstractMarker> cluster) { chosenCluster = cluster; return false; } });
      
      







рдЖрдкрдХреЛ OnMarkerClickListener рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░рдореИрди рдХреЛ рднреА рд╢реНрд░реЛрддрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛:



 map.setOnMarkerClickListener(clusterManager);
      
      







рдЕрдм рдЖрдкрдХреЛ рд╕рднреА рдЯреЛрдХрди рдФрд░ рд╕рднреА рд╕рдореВрд╣реЛрдВ рдХреЛ InfoWindowAdapter рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреНрд▓рд╕реНрдЯрд░ рдореИрдирдЬрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдорд╛рд░реНрдХрд░ рдХреНрд▓рд╕реНрдЯрд░реНрд╕ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ InfoWindowAdapter рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:

 clusterManager.getMarkerCollection().setOnInfoWindowAdapter(new MarkerInfoWindowAdapter()); clusterManager.getClusterMarkerCollection().setOnInfoWindowAdapter(new ClusterInfoWindow()); map.setInfoWindowAdapter(clusterManager.getMarkerManager());
      
      







рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ClusterInfoWindow рд╡рд░реНрдЧ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:



 private class ClusterInfoWindow implements InfoWindowAdapter { @Override public View getInfoContents(Marker arg0) { return null; } @Override public View getInfoWindow(Marker marker) { if (chosenCluster != null) { View v = getLayoutInflater().inflate(R.layout.cluster_window, null); TextView info = (TextView) v.findViewById(R.id.clusterTitle); int[] markerTypesCount = new int[2]; Arrays.fill(markerTypesCount, 0); for (AbstractMarker abstractMarker : chosenCluster.getItems()) { if (abstractMarker instanceof TradeMarker) markerTypesCount[0] += 1; else if (abstractMarker instanceof TruckMarker) markerTypesCount[1] += 1; } info.setText("Trade places: " + markerTypesCount[0] + "\n" + "Truck: " + markerTypesCount[1] + "\n"); return v; } return null; } }
      
      







рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдПрдХ рд╕реБрдВрджрд░ рдФрд░ рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирдХреНрд╢рд╛ рдмрдирд╛рдпрд╛ред



рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреЗрд╡рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдирд╣реАрдВ рдЫреЛрдбрд╝реВрдВрдЧрд╛ред рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!



PS рд╕реНрд▓реИрдХ рдореЗрдВ Android рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред



All Articles