@Override protected void onDraw(Canvas canvas) { if (canvas == null) return; if (drawing.compareAndSet(false, true)) { List<Marker> collection = ARData.getMarkers(); cache.clear(); for (Marker m : collection) { m.update(canvas, 0, 0); if (m.isOnRadar()) cache.add(m); cache.add(m); } collection = cache; if (AugmentedActivity.useCollisionDetection) adjustForCollisions(canvas, collection); ListIterator<Marker> iter = collection.listIterator(collection.size()); while (iter.hasPrevious()) { Marker marker = iter.previous(); marker.draw(canvas); } if (AugmentedActivity.showRadar) radar.draw(canvas); drawing.set(false); } }
private static void adjustForCollisions(Canvas canvas, List<Marker> collection) { updated.clear(); for (Marker marker1 : collection) { if (updated.contains(marker1) || !marker1.isInView()) continue; int collisions = 1; for (Marker marker2 : collection) { if (marker1.equals(marker2) || updated.contains(marker2) || !marker2.isInView()) continue; if (marker1.isMarkerOnMarker(marker2)) { marker2.getLocation().get(locationArray); float y = locationArray[1]; float h = collisions * COLLISION_ADJUSTMENT; locationArray[1] = y + h; marker2.getLocation().set(locationArray); marker2.update(canvas, 0, 0); collisions++; updated.add(marker2); } } updated.add(marker1); } }