52
52
import com .google .android .gms .maps .model .Marker ;
53
53
import com .google .android .gms .maps .model .MarkerOptions ;
54
54
import com .google .maps .android .R ;
55
+ import com .google .maps .android .RendererLogger ;
55
56
import com .google .maps .android .clustering .Cluster ;
56
57
import com .google .maps .android .clustering .ClusterItem ;
57
58
import com .google .maps .android .clustering .ClusterManager ;
@@ -107,10 +108,7 @@ public enum AnimationType {
107
108
108
109
public void setAnimationType (AnimationType type ) {
109
110
switch (type ) {
110
- case LINEAR :
111
- animationInterp = new LinearInterpolator ();
112
- break ;
113
- case EASE_IN :
111
+ case EASE_IN , ACCELERATE :
114
112
animationInterp = new AccelerateInterpolator ();
115
113
break ;
116
114
case EASE_OUT :
@@ -125,9 +123,6 @@ public void setAnimationType(AnimationType type) {
125
123
case BOUNCE :
126
124
animationInterp = new BounceInterpolator ();
127
125
break ;
128
- case ACCELERATE :
129
- animationInterp = new AccelerateInterpolator ();
130
- break ;
131
126
case DECELERATE :
132
127
animationInterp = new DecelerateInterpolator ();
133
128
break ;
@@ -196,35 +191,47 @@ public ClusterRendererMultipleItems(Context context, GoogleMap map, ClusterManag
196
191
197
192
@ Override
198
193
public void onAdd () {
199
- mClusterManager .getMarkerCollection ().setOnMarkerClickListener (marker -> mItemClickListener != null && mItemClickListener .onClusterItemClick (mMarkerCache .get (marker )));
194
+ RendererLogger .d ("ClusterRenderer" , "Setting up MarkerCollection listeners" );
195
+
196
+ mClusterManager .getMarkerCollection ().setOnMarkerClickListener (marker -> {
197
+ RendererLogger .d ("ClusterRenderer" , "Marker clicked: " + marker );
198
+ return mItemClickListener != null && mItemClickListener .onClusterItemClick (mMarkerCache .get (marker ));
199
+ });
200
200
201
201
mClusterManager .getMarkerCollection ().setOnInfoWindowClickListener (marker -> {
202
+ RendererLogger .d ("ClusterRenderer" , "Info window clicked for marker: " + marker );
202
203
if (mItemInfoWindowClickListener != null ) {
203
204
mItemInfoWindowClickListener .onClusterItemInfoWindowClick (mMarkerCache .get (marker ));
204
205
}
205
206
});
206
207
207
208
mClusterManager .getMarkerCollection ().setOnInfoWindowLongClickListener (marker -> {
209
+ RendererLogger .d ("ClusterRenderer" , "Info window long-clicked for marker: " + marker );
208
210
if (mItemInfoWindowLongClickListener != null ) {
209
211
mItemInfoWindowLongClickListener .onClusterItemInfoWindowLongClick (mMarkerCache .get (marker ));
210
212
}
211
213
});
212
214
215
+ RendererLogger .d ("ClusterRenderer" , "Setting up ClusterMarkerCollection listeners" );
216
+
213
217
mClusterManager .getClusterMarkerCollection ().setOnMarkerClickListener (marker -> mClickListener != null && mClickListener .onClusterClick (mClusterMarkerCache .get (marker )));
214
218
215
219
mClusterManager .getClusterMarkerCollection ().setOnInfoWindowClickListener (marker -> {
220
+ RendererLogger .d ("ClusterRenderer" , "Info window clicked for cluster marker: " + marker );
216
221
if (mInfoWindowClickListener != null ) {
217
222
mInfoWindowClickListener .onClusterInfoWindowClick (mClusterMarkerCache .get (marker ));
218
223
}
219
224
});
220
225
221
226
mClusterManager .getClusterMarkerCollection ().setOnInfoWindowLongClickListener (marker -> {
227
+ RendererLogger .d ("ClusterRenderer" , "Info window long-clicked for cluster marker: " + marker );
222
228
if (mInfoWindowLongClickListener != null ) {
223
229
mInfoWindowLongClickListener .onClusterInfoWindowLongClick (mClusterMarkerCache .get (marker ));
224
230
}
225
231
});
226
232
}
227
233
234
+
228
235
@ Override
229
236
public void onRemove () {
230
237
mClusterManager .getMarkerCollection ().setOnMarkerClickListener (null );
@@ -270,6 +277,19 @@ public int getClusterTextAppearance(int clusterSize) {
270
277
return R .style .amu_ClusterIcon_TextAppearance ; // Default value
271
278
}
272
279
280
+ /**
281
+ * Enables or disables logging for the cluster renderer.
282
+ *
283
+ * <p>When enabled, the renderer will log internal operations such as cluster rendering,
284
+ * marker updates, and other debug information. This is useful for development and debugging,
285
+ * but should typically be disabled in production builds.</p>
286
+ *
287
+ * @param enabled {@code true} to enable logging; {@code false} to disable it.
288
+ */
289
+ public void setLoggingEnabled (boolean enabled ) {
290
+ RendererLogger .setEnabled (enabled );
291
+ }
292
+
273
293
@ NonNull
274
294
protected String getClusterText (int bucket ) {
275
295
if (bucket < BUCKETS [0 ]) {
@@ -447,8 +467,9 @@ public void run() {
447
467
448
468
try {
449
469
visibleBounds = mProjection .getVisibleRegion ().latLngBounds ;
470
+ RendererLogger .d ("ClusterRenderer" , "Visible bounds calculated: " + visibleBounds );
450
471
} catch (Exception e ) {
451
- e . printStackTrace ( );
472
+ RendererLogger . e ( "ClusterRenderer" , "Error getting visible bounds, defaulting to (0,0)" );
452
473
visibleBounds = LatLngBounds .builder ().include (new LatLng (0 , 0 )).build ();
453
474
}
454
475
@@ -462,6 +483,7 @@ public void run() {
462
483
existingClustersOnScreen .add (point );
463
484
}
464
485
}
486
+ RendererLogger .d ("ClusterRenderer" , "Existing clusters on screen found: " + existingClustersOnScreen .size ());
465
487
}
466
488
467
489
// Create the new markers and animate them to their new positions.
@@ -474,20 +496,25 @@ public void run() {
474
496
if (closest != null ) {
475
497
LatLng animateFrom = mSphericalMercatorProjection .toLatLng (closest );
476
498
markerModifier .add (true , new CreateMarkerTask (c , newMarkers , animateFrom ));
499
+ RendererLogger .d ("ClusterRenderer" , "Animating cluster from closest cluster: " + c .getPosition ());
477
500
} else {
478
501
markerModifier .add (true , new CreateMarkerTask (c , newMarkers , null ));
502
+ RendererLogger .d ("ClusterRenderer" , "Animating cluster without closest point: " + c .getPosition ());
479
503
}
480
504
481
505
} else {
482
506
markerModifier .add (onScreen , new CreateMarkerTask (c , newMarkers , null ));
507
+ RendererLogger .d ("ClusterRenderer" , "Adding cluster without animation: " + c .getPosition ());
483
508
}
484
509
}
485
510
486
511
// Wait for all markers to be added.
487
512
markerModifier .waitUntilFree ();
513
+ RendererLogger .d ("ClusterRenderer" , "All new markers added, count: " + newMarkers .size ());
488
514
489
515
// Don't remove any markers that were just added. This is basically anything that had a hit in the MarkerCache.
490
516
markersToRemove .removeAll (newMarkers );
517
+ RendererLogger .d ("ClusterRenderer" , "Markers to remove after filtering new markers: " + markersToRemove .size ());
491
518
492
519
// Find all of the new clusters that were added on-screen. These are candidates for markers to animate from.
493
520
List <Point > newClustersOnScreen = null ;
@@ -499,6 +526,7 @@ public void run() {
499
526
newClustersOnScreen .add (p );
500
527
}
501
528
}
529
+ RendererLogger .d ("ClusterRenderer" , "New clusters on screen found: " + newClustersOnScreen .size ());
502
530
}
503
531
504
532
for (final MarkerWithPosition marker : markersToRemove ) {
@@ -509,6 +537,7 @@ public void run() {
509
537
if (closest != null ) {
510
538
LatLng animateTo = mSphericalMercatorProjection .toLatLng (closest );
511
539
markerModifier .animateThenRemove (marker , marker .position , animateTo );
540
+ RendererLogger .d ("ClusterRenderer" , "Animating then removing marker at position: " + marker .position );
512
541
} else if (mClusterMarkerCache .mCache .keySet ().iterator ().hasNext () && mClusterMarkerCache .mCache .keySet ().iterator ().next ().getItems ().contains (marker .clusterItem )) {
513
542
T foundItem = null ;
514
543
for (Cluster <T > cluster : mClusterMarkerCache .mCache .keySet ()) {
@@ -518,27 +547,31 @@ public void run() {
518
547
break ;
519
548
}
520
549
}
521
-
522
550
}
523
551
// Remove it because it will join a cluster
524
552
markerModifier .animateThenRemove (marker , marker .position , foundItem .getPosition ());
553
+ RendererLogger .d ("ClusterRenderer" , "Animating then removing marker joining cluster at position: " + marker .position );
525
554
} else {
526
555
markerModifier .remove (true , marker .marker );
556
+ RendererLogger .d ("ClusterRenderer" , "Removing marker without animation at position: " + marker .position );
527
557
}
528
558
} else {
529
559
markerModifier .remove (onScreen , marker .marker );
560
+ RendererLogger .d ("ClusterRenderer" , "Removing marker (onScreen=" + onScreen + ") at position: " + marker .position );
530
561
}
531
562
}
532
563
533
564
// Wait until all marker removal operations are completed.
534
565
markerModifier .waitUntilFree ();
566
+ RendererLogger .d ("ClusterRenderer" , "All marker removal operations completed." );
535
567
536
568
mMarkers = newMarkers ;
537
569
ClusterRendererMultipleItems .this .mClusters = clusters ;
538
570
mZoom = zoom ;
539
571
540
572
// Run the callback once everything is done.
541
573
mCallback .run ();
574
+ RendererLogger .d ("ClusterRenderer" , "Cluster update callback executed." );
542
575
}
543
576
}
544
577
@@ -1076,13 +1109,16 @@ public CreateMarkerTask(Cluster<T> c, Set<MarkerWithPosition> markersAdded, LatL
1076
1109
private void perform (MarkerModifier markerModifier ) {
1077
1110
// Don't show small clusters. Render the markers inside, instead.
1078
1111
if (!shouldRenderAsCluster (cluster )) {
1112
+ RendererLogger .d ("ClusterRenderer" , "Rendering individual cluster items, count: " + cluster .getItems ().size ());
1079
1113
for (T item : cluster .getItems ()) {
1080
1114
Marker marker = mMarkerCache .get (item );
1081
1115
MarkerWithPosition <T > markerWithPosition ;
1082
1116
LatLng currentLocation = item .getPosition ();
1083
1117
if (marker == null ) {
1118
+ RendererLogger .d ("ClusterRenderer" , "Creating new marker for cluster item at position: " + currentLocation );
1084
1119
MarkerOptions markerOptions = new MarkerOptions ();
1085
1120
if (animateFrom != null ) {
1121
+ RendererLogger .d ("ClusterRenderer" , "Animating from position: " + animateFrom );
1086
1122
markerOptions .position (animateFrom );
1087
1123
} else if (mClusterMarkerCache .mCache .keySet ().iterator ().hasNext () && mClusterMarkerCache .mCache .keySet ().iterator ().next ().getItems ().contains (item )) {
1088
1124
T foundItem = null ;
@@ -1095,6 +1131,7 @@ private void perform(MarkerModifier markerModifier) {
1095
1131
}
1096
1132
}
1097
1133
currentLocation = foundItem .getPosition ();
1134
+ RendererLogger .d ("ClusterRenderer" , "Found item in cache for animation at position: " + currentLocation );
1098
1135
markerOptions .position (currentLocation );
1099
1136
} else {
1100
1137
markerOptions .position (item .getPosition ());
@@ -1108,13 +1145,17 @@ private void perform(MarkerModifier markerModifier) {
1108
1145
mMarkerCache .put (item , marker );
1109
1146
if (animateFrom != null ) {
1110
1147
markerModifier .animate (markerWithPosition , animateFrom , item .getPosition ());
1148
+ RendererLogger .d ("ClusterRenderer" , "Animating marker from " + animateFrom + " to " + item .getPosition ());
1111
1149
} else if (currentLocation != null ) {
1112
1150
markerModifier .animate (markerWithPosition , currentLocation , item .getPosition ());
1151
+ RendererLogger .d ("ClusterRenderer" , "Animating marker from " + currentLocation + " to " + item .getPosition ());
1113
1152
}
1114
1153
} else {
1115
1154
markerWithPosition = new MarkerWithPosition <>(marker , item );
1116
1155
markerModifier .animate (markerWithPosition , marker .getPosition (), item .getPosition ());
1156
+ RendererLogger .d ("ClusterRenderer" , "Animating existing marker from " + marker .getPosition () + " to " + item .getPosition ());
1117
1157
if (!markerWithPosition .position .equals (item .getPosition ())) {
1158
+ RendererLogger .d ("ClusterRenderer" , "Updating cluster item marker position" );
1118
1159
onClusterItemUpdated (item , marker );
1119
1160
}
1120
1161
}
@@ -1125,19 +1166,23 @@ private void perform(MarkerModifier markerModifier) {
1125
1166
}
1126
1167
1127
1168
// Handle cluster markers
1169
+ RendererLogger .d ("ClusterRenderer" , "Rendering cluster marker at position: " + cluster .getPosition ());
1128
1170
Marker marker = mClusterMarkerCache .get (cluster );
1129
1171
MarkerWithPosition markerWithPosition ;
1130
1172
if (marker == null ) {
1173
+ RendererLogger .d ("ClusterRenderer" , "Creating new cluster marker" );
1131
1174
MarkerOptions markerOptions = new MarkerOptions ().position (animateFrom == null ? cluster .getPosition () : animateFrom );
1132
1175
onBeforeClusterRendered (cluster , markerOptions );
1133
1176
marker = mClusterManager .getClusterMarkerCollection ().addMarker (markerOptions );
1134
1177
mClusterMarkerCache .put (cluster , marker );
1135
1178
markerWithPosition = new MarkerWithPosition (marker , null );
1136
1179
if (animateFrom != null ) {
1137
1180
markerModifier .animate (markerWithPosition , animateFrom , cluster .getPosition ());
1181
+ RendererLogger .d ("ClusterRenderer" , "Animating cluster marker from " + animateFrom + " to " + cluster .getPosition ());
1138
1182
}
1139
1183
} else {
1140
1184
markerWithPosition = new MarkerWithPosition (marker , null );
1185
+ RendererLogger .d ("ClusterRenderer" , "Updating existing cluster marker" );
1141
1186
onClusterUpdated (cluster , marker );
1142
1187
}
1143
1188
onClusterRendered (cluster , marker );
0 commit comments