2011-11-19 18 views
13

Quiero animar los marcadores del mapa cuando se agregan al mapa.Cómo animar marcador cuando se agrega al mapa en Android?

El usuario debe ver el mapa con marcadores a su alrededor. Cada nuevo marcador debería rebotar.

+1

Uso MapOverlay y el diseño del marco para inflar marcador, a continuación, obtener su imagen Vista del objeto a continuación, iniciar la animación en la que la actividad mapa. – Noby

+0

Creo que este enlace responde a su pregunta: http: // stackoverflow.com/questions/7407475/can-i-use-animationdrawable-in-an-overlay-on-a-mapview –

Respuesta

0

Usted puede agregar cualquier nueva disposición a MAPview como marcador de ruta:

public void AddAnimMarkerToMap(MapView map, GeoPoint geoPoint, int id, int animResId) 
{ 
    var layoutParams = new MapView.LayoutParams(ViewGroup.LayoutParams.WrapContent, 
               ViewGroup.LayoutParams.WrapContent, 
               geoPoint, 
               MapView.LayoutParams.Center); 

    var ll = new LinearLayout(map.Context) { Id = id, Orientation = Orientation.Vertical }; 
    ll.SetGravity(GravityFlags.Center); 

    var iv = new ImageView(map.Context); 
    iv.SetImageResource(animResId); 

    ll.AddView(iv); 
    map.AddView(ll, layoutParams); 

    var markerAnimation = (AnimationDrawable)iv.Drawable; 
    markerAnimation.Start(); 
    ll.LayoutParameters = layoutParams; 
} 

probablemente le puede añadir directamente sin ImageView wraping diseño. animResId es el recurso dibujable de la animación de cuadros (similar al marcador Mylocation de Android).

http://developer.android.com/guide/topics/resources/animation-resource.html#Frame

12

Puede implementar la onMarkerClick() y hacer que el rebote marcador cada vez que el usuario hace clic en él. Solo prueba debajo de la implementación del código. Lo he intentado y funciona totalmente bien.

private Marker mPerth; 
private Marker mPerth = mMap.addMarker(new MarkerOptions() 
      .position(PERTH) 
      .title("Perth") 
      .snippet("Population: 1,738,800"));   
@Override 
public boolean onMarkerClick(final Marker marker) 
    { 
     // This causes the marker at Perth to bounce into position when it is clicked. 
    if (marker.equals(mPerth)) { 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     Projection proj = mMap.getProjection(); 
     Point startPoint = proj.toScreenLocation(PERTH); 
     startPoint.offset(0, -100); 
     final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
     final long duration = 1500; 
     final Interpolator interpolator = new BounceInterpolator(); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - start; 
       float t = interpolator.getInterpolation((float) elapsed/duration); 
       double lng = t * PERTH.longitude + (1 - t) * startLatLng.longitude; 
       double lat = t * PERTH.latitude + (1 - t) * startLatLng.latitude; 
       marker.setPosition(new LatLng(lat, lng)); 
       if (t < 1.0) { 
        // Post again 16ms later. 
        handler.postDelayed(this, 16); 
       } 
      } 
     }); 
    } 
    // We return false to indicate that we have not consumed the event and that we wish 
    // for the default behavior to occur (which is for the camera to move such that the 
    // marker is centered and for the marker's info window to open, if it has one). 
    return false; 
} 

También puede utilizar esto en el momento de añadir el marcador en su aplicación, además de onClick evento. Espero que esto sea lo que quieras solo.

+0

¡Eres mi héroe, gracias! –

+0

Probé el mismo código, pero obtengo el error en línea, Interpolator interpolator = new LinearInterpolator(); "Tipos incompatibles" –

0

Ancle el marcador fuera de la pantalla o en su posición de inicio y luego comience la animación.

Nota del .setAnchor utilizado en este método fue introducido en el mapa google api v2 de mayo de 2013 en

acabo ahora tengo este trabajo para un marcador mediante la deformación de las muestras extras mapas de demostración y I don' Me gusta el rendimiento de esta implementación. La pieza más importante es anclar el marcador fuera de la pantalla o apagarlo en la posición de inicio. Estoy usando fuera de la pantalla de arriba.

Ancla el marcador fuera de la pantalla .setAnchor (.5f, (tamaño de la pantalla encima del marcador/tamaño del marcador)) // para el mapa de demostración perth es de aproximadamente 6f para mi teléfono de prueba. Cambiar la animación para que rebote al mismo valor fue 6f para mi teléfono de prueba.

private void addMarkersToMap() { 
    // A few more markers for good measure. 
mPerth = mMap.addMarker(new MarkerOptions().position(PERTH) 
      .title("Perth").snippet("Population: 1,738,800") 
      .anchor(.5f, 6f) 
      ); 

cambiar la animación por lo que rebota a (tamaño de pantalla de arriba marcador/tamaño del marcador) (6f de mi teléfono de prueba). Solo estoy usando el controlador onclick porque ya está configurado para rebotar con ajustes de rebote a 6f y una duración más larga. Entonces, después de que todos los marcadores se hayan agregado al mapa, desactivo el controlador de clics.

this.onMarkerClick(mPerth); 

Cambió el controlador onMarkerClick con la 6f y una duración más larga.

@Override 
public boolean onMarkerClick(final Marker marker) { 
    if (marker.equals(mPerth)) { 
     // This causes the marker at Perth to bounce into position when it 
     // is clicked. 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     final long duration = 2500; 

     final Interpolator interpolator = new BounceInterpolator(); 

     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - start; 
       float t = Math.max(
         1 - interpolator.getInterpolation((float) elapsed 
           /duration), 0); 

       marker.setAnchor(0.5f, 1.0f + 6 * t); 

       if (t > 0.0) { 
        // Post again 16ms later. 
        handler.postDelayed(this, 16); 
       } 
      } 
     }); 
    } else if (marker.equals(mAdelaide)) { 
     // This causes the marker at Adelaide to change color. 
     marker.setIcon(BitmapDescriptorFactory.defaultMarker(new Random() 
       .nextFloat() * 360)); 
    } 
    // We return false to indicate that we have not consumed the event and 
    // that we wish 
    // for the default behavior to occur (which is for the camera to move 
    // such that the 
    // marker is centered and for the marker's info window to open, if it 
    // has one). 
    return false; 
} 

buena suerte

Cuestiones relacionadas