Saltar al contenido

Animación de marcadores en Google Maps v2

Solución:

Algunos ingenieros de Google han proporcionado un buen video de demostración con un código de muestra elegante sobre cómo animar marcadores desde un punto de partida hasta un punto final, para todas las versiones de Android:

El código relevante está aquí:

https://gist.github.com/broady/6314689

Y un buen video de demostración de todo ello en acción.

ANTIGUA RESPUESTA DESAPARECIDA ABAJO

En la documentación, se menciona que los iconos de marcadores no se pueden cambiar:

Icono

Un mapa de bits que se muestra para el marcador. Si el icono no se configura, se muestra un icono predeterminado. Puede especificar un color alternativo del icono predeterminado utilizando defaultMarker (flotante). No puede cambiar el icono una vez que haya creado el marcador.

Documentación de la API de Google Maps v2

Tendrá que realizar un seguimiento de marcadores específicos, tal vez utilizando un método similar al que se describe aquí: vincular un marcador a un objeto, luego averiguar qué marcador necesita actualizar. Llama .remove() en el marcador, luego cree una imagen rotada según la “dirección” que desee, cree un nuevo marcador con esa imagen y agregue el nuevo marcador al mapa.

No es necesario que “borre” el mapa, simplemente elimine el marcador que desea modificar, cree uno nuevo y luego vuelva a agregarlo al mapa.

Desafortunadamente, la nueva API de Maps aún no es muy flexible. Es de esperar que Google continúe mejorando.

Ejemplo de uso para la respuesta de DiscDev (arriba):

LatLng fromLocation = new LatLng(38.5, -100.4); // Whatever origin coordinates
LatLng toLocation = new LatLng(37.7, -107.7); // Whatever destination coordinates
Marker marker = mMap.addMarker(new MarkerOptions().position(firstLocation));
MarkerAnimation.animateMarkerToICS(marker, toLocation, new LatLngInterpolator.Spherical());

Y para aquellos de ustedes que usan GPS / o cualquier proveedor de posición que reciba actualizaciones de ubicación:

Marker ourGlobalMarker;
// We've got a location from some provider of ours, now we can call:
private void updateMarkerPosition(Location newLocation) {

    LatLng newLatLng = new LatLng(newLocation.getLatitude(), newLocation.getLongitude());

    if(ourGlobalMarker == null) { // First time adding marker to map
        ourGlobalMarker = mMap.addMarker(new MarkerOptions().position(newLatLng));
    }
    else {
        MarkerAnimation.animateMarkerToICS(ourGlobalMarker, newLatLng, new LatLngInterpolator.Spherical());
    }         
}

IMPORTANTE:

Dentro de 1MarkerAnimation.java Si la duración de la animación se establece en X, y está recibiendo actualizaciones de ubicación a una velocidad menor que X, se activarán varias animaciones y es posible que vea que la animación del marcador parpadea un poco (lo que no es una buena experiencia para el usuario).

Para evitar esto, el animationMarkerToICS método (tomé aquí animationMarkerToICS por ejemplo), debería verse así,

implementación completa del método:

private static Animator animator; // MAKING ANIMATOR GLOBAL INSTEAD OF LOCAL TO THE STATIC FUNCTION

...

// Ice Cream Sandwich compatible
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public static void animateMarkerToICS(Marker marker, LatLng finalPosition, final LatLngInterpolator latLngInterpolator) {

    TypeEvaluator<LatLng> typeEvaluator = new TypeEvaluator<LatLng>() {
        @Override
        public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) {
            return latLngInterpolator.interpolate(fraction, startValue, endValue);
        }
    };
    Property<Marker, LatLng> property = Property.of(Marker.class, LatLng.class, "position");

    // ADD THIS TO STOP ANIMATION IF ALREADY ANIMATING TO AN OBSOLETE LOCATION
    if(animator != null && animator.isRunning()) {
        animator.cancel();
        animator = null;
    }
    animator = ObjectAnimator.ofObject(marker, property, typeEvaluator, finalPosition);
    animator.setDuration((long) ANIMATION_DURATION);
    animator.start();
}

Disfrutar.

Marker tiene una nueva función agregada a partir de la rev.7 de API v2. Marker.setIcon, por lo que puede utilizar varios iconos para mostrar la dirección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *