2014-09-29 3 views
8

Ich habe einen Marker für meinen Standort platziert. Ich möchte meinen Marker problemlos etwas wie die Google Maps App bewegen. Der blaue Kreis bewegt sich sehr sanft, wenn ich mich in meinem Auto bewege. Ich möchte das Gleiche für meine App implementieren. Wie implementiere ich das auf meiner App?Wie man fortwährend den aktuellen Standortmarker in Google Maps v2 android bewegt

Ab sofort springt mein Standortmarker für einen anderen Standort nur bei sehr Standortwechsel und markiert dort den Marker.

Hier ist, was ich habe don:

@Override 
public void onMyLocationChange(Location location) 
{ 
    curlat = location.getLatitude(); 
    curlong = location.getLongitude(); 

    if (markermylocation != null) 
    { 
     markermylocation.remove(); 
    } 

     curlat = location.getLatitude(); 
     curlong = location.getLongitude(); 
     myLocation(curlat, curlong, username, imageURL, ZOOMVALUE); 
} 

in mylocaiton Methode:

private void myLocation(double lat, double lng, String name, String url, float zoom) 
{ 
    if(firsttime == 1) 
    { 
     LatLng ll = new LatLng(lat,lng); 
     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, zoom); 
     googleMap.animateCamera(update); 
     firsttime = 0; 
    } 

    final String uname = name; 
    curlat = lat; 
    curlong = lng; 
    LatLng position = new LatLng(curlat, curlong); 

    markerOptionsmylocaiton = new MarkerOptions().position(position).icon(BitmapDescriptorFactory.fromBitmap(icon)).title(uname).anchor(0.5f, 1f); 
    markermylocation = googleMap.addMarker(markerOptionsmylocaiton); 

    LatLng latlang = new LatLng(curlat, curlong); 
    animateMarker(markermylocation, latlang, false); 
} 

So jedes Mal mylocation wird der Marker genannt

googleMap.setMyLocationEnabled(true); 

So onMyLocationChange Methode automatisch aufgerufen wird, wird entfernt und ruft mylocation-Methode auf und erstellt dann den Marker im neuen Postition. Stattdessen möchte ich einen weichen Übergang des Markers wie Google Maps bekommen? Wie implementiert man das?

Update:

Nach paar Mal daran zu arbeiten: ich an diesem Code schließlich kam dann aber nicht meine Markierungen zeigen sich:

ich das unten stehende Methode verwende und diese in MyLocation jedes Mal aufrufen Methode.

public void animateMarker(final Marker marker, final LatLng toPosition, 
     final boolean hideMarker) 
{ 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    Projection proj = googleMap.getProjection(); 
    Point startPoint = proj.toScreenLocation(marker.getPosition()); 
    final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
    final long duration = 500; 

    final Interpolator interpolator = new LinearInterpolator(); 

    handler.post(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      long elapsed = SystemClock.uptimeMillis() - start; 
      float t = interpolator.getInterpolation((float) elapsed 
        /duration); 
      double lng = t * toPosition.longitude + (1 - t) 
        * startLatLng.longitude; 
      double lat = t * toPosition.latitude + (1 - t) 
        * startLatLng.latitude; 
      marker.setPosition(new LatLng(lat, lng)); 

      if (t < 1.0) 
      { 
       // Post again 16ms later. 
       handler.postDelayed(this, 16); 
      } 
      else 
      { 
       if (hideMarker) 
       { 
        marker.setVisible(false); 
       } 
       else 
       { 
        marker.setVisible(true); 
       } 
      } 
     } 
    }); 
} 

Vielen Dank!

Antwort

0

Sie müssen einen Interpolator verwenden, einen linearen Interpolator oder einen Beschleunigungsinterpolator zwischen der neuen Position und der aktuellen Länge des Markers. Hier ist ein Beispiel mit einem Bounce-Interpolator.

final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     final long duration = 2500; 

     final Interpolator interpolator = new BounceInterpolator(); 
     marker.setVisible(true); 

     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); 
       marker.setPosition(latlng) 

       if (t > 0.0) { 
        // Post again 16ms later. 
        handler.postDelayed(this, 16); 
       } 
      } 
     }); 
+0

Danke für die schnelle Antwort. Lass mich das arbeiten und zurückkommen. Ich bin überrascht, dass es schwierig ist, einen weichen Marker zu bewegen. :( – TheDevMan

+0

Die Runnable ist Freund für die Erstellung einfacher Animationen. Ja ist es schwierig, nicht schwierig. Sie können leicht die Markierung latlng ändern. Marker.setPosition (latlng), aber es wird auch etwas klobig sein. – danny117

+0

Endlich bekam eine Chance, daran zu arbeiten. Ich benutzte deine Logik + andere Referenz kam mit dem obigen Code. Das Problem ist, dass wenn ich es benutze ich sehe meine Markierung überhaupt nicht. Es kommt auf und geht einfach weg. Bitte sehen Sie sich meinen Code. Lassen Sie es mich wissen wo könnte das Problem sein? Danke! – TheDevMan

Verwandte Themen