2011-11-19 7 views
13

Desidero animare gli indicatori di mappa quando vengono aggiunti alla mappa.Come animare un marcatore quando viene aggiunto alla mappa su Android?

L'utente dovrebbe visualizzare la mappa con gli indicatori intorno a sé. Ogni nuovo segnalino dovrebbe rimbalzare.

+1

Usa MapOverlay e il layout della montatura per gonfiare marcatore, quindi ottenere la vostra immagine Vista oggetto quindi iniziare l'animazione su che in mappa attività. – Noby

+0

Penso che questo link risponda alla tua domanda: http: // stackoverflow.it/questions/7407475/can-i-use-animationdrawable-in-an-overlay-on-a-mapview –

risposta

0

è possibile aggiungere qualsiasi nuovo layout per MapView come mappa marcatore:

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; 
} 

probabilmente è possibile aggiungere ImageView direttamente senza wraping layout. animResId è la risorsa disegnabile di animazione Frame (simile al marcatore di Mylocation Android).

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

12

È possibile implementare la onMarkerClick() e fare il rimbalzo marcatore ogni volta che l'utente fa clic su di esso. Basta provare sotto l'implementazione del codice. L'ho provato e funziona perfettamente.

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; 
} 

È anche possibile utilizzare questo al momento di aggiungere il marcatore nella propria applicazione, oltre onClick evento. Spero che questo sia ciò che vuoi solo.

+0

Sei il mio eroe, grazie! –

+0

Ho provato lo stesso codice, ma ricevendo errore in linea, Interpolator interpolator = new LinearInterpolator(); "Tipi incompatibili" –

0

Ancorare l'indicatore sullo schermo o nella posizione iniziale quindi avviare l'animazione.

Annotare il .setAnchor utilizzato in questo metodo è stato aggiunto alla Google Map API v2 maggio 2013

Ho appena ricevuto questa ora lavora per un marcatore modificando i campioni extra mappe demo e I don' mi piace l'esecuzione di questa implementazione. Il pezzo più importante è ancorare il marcatore fuori dallo schermo o disattivarlo nella posizione iniziale. Sto usando fuori dallo schermo sopra.

Anchor il marcatore fuori dallo schermo .setAnchor (.5f, (dimensioni dello schermo sopra marcatore/dimensioni del marcatore)) // per l'Perth Mappa demo è circa 6f per il mio telefono di prova. Cambia l'animazione per rimbalzare sullo stesso valore era 6f per il mio telefono di prova.

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) 
      ); 

Cambiare l'animazione in modo che rimbalza a (dimensioni dello schermo sopra marcatore/dimensioni del marcatore) (6f sul mio telefono di prova). Sto solo usando il gestore onclick perché è già configurato per rimbalzare con ritocchi di rimbalzo su 6f e una durata maggiore. Quindi, dopo che tutti i marcatori sono stati aggiunti alla mappa, sparo il gestore dei clic.

this.onMarkerClick(mPerth); 

Il gestore onMarkerClick cambiato con l'6f e la durata più lunga.

@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; 
} 

Good Luck

Problemi correlati