Skip to content

Instantly share code, notes, and snippets.

@piruin
Last active May 20, 2020 16:56
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save piruin/94dc141e7736851b002c to your computer and use it in GitHub Desktop.
Save piruin/94dc141e7736851b002c to your computer and use it in GitHub Desktop.
android marker drop in animation on google maps
protected Marker addMarker(LatLng position, @ColorRes int color, boolean draggable) {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.draggable(draggable);
markerOptions.icon(MapUtils.getIconBitmapDescriptor(getActivity(), color));
markerOptions.position(position);
Marker pinnedMarker = googleMap.addMarker(markerOptions);
startDropMarkerAnimation(pinnedMarker);
return pinnedMarker;
}
private void startDropMarkerAnimation(final Marker marker) {
final LatLng target = marker.getPosition();
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = getMap().getProjection();
Point targetPoint = proj.toScreenLocation(target);
final long duration = (long) (200 + (targetPoint.y * 0.6));
Point startPoint = proj.toScreenLocation(marker.getPosition());
startPoint.y = 0;
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final Interpolator interpolator = new LinearOutSlowInInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed / duration);
double lng = t * target.longitude + (1 - t) * startLatLng.longitude;
double lat = t * target.latitude + (1 - t) * startLatLng.latitude;
marker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
// Post again 16ms later == 60 frames per second
handler.postDelayed(this, 16);
}
}
});
}
@keithics
Copy link

keithics commented Apr 4, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment