2016-10-05 13 views
2

このコードを使用してマーカーをアニメーション化し、Googleマップ上の車両の動きを複製しますが、marker.setPositionがハンドラー関数で呼び出されたときに激しく動かします。以下のコードは次のとおりです。アニメーションを追加するとマーカーが揺れます。Googleマップandroid

public static void animateMarker(final GoogleMap map, final Marker marker, final LatLng toPosition) { 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    Projection proj = map.getProjection(); 
    Point startPoint = proj.toScreenLocation(marker.getPosition()); 
    final LatLng startLatLng = proj.fromScreenLocation(startPoint); 
    final long duration = 5000; 
    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) { 
       handler.postDelayed(this, 16); 
      } 
     } 
    }); 
} 
+0

問題を解決できましたか? –

答えて

0

は、その変更が開始率とゆっくり終わるが、このGoogle video tutorialで使用される代わりにLinearInterpolatorの、中央から加速補間をAccelerateDecelerateInterpolatorを使用してみてください。マーカーアニメーションはシームレスでした。スニペットは次のとおりです。

public class MarkerAnimation { 
    static void animateMarkerToGB(final Marker marker, final LatLng finalPosition, final LatLngInterpolator latLngInterpolator) { 
     final LatLng startPosition = marker.getPosition(); 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     final Interpolator interpolator = new AccelerateDecelerateInterpolator(); 
     final float durationInMs = 3000; 

    handler.post(new Runnable() { 
     long elapsed; 
     float t; 
     float v; 

     @Override 
     public void run() { 
      // Calculate progress using interpolator 
      elapsed = SystemClock.uptimeMillis() - start; 
      t = elapsed/durationInMs; 
      v = interpolator.getInterpolation(t); 

      marker.setPosition(latLngInterpolator.interpolate(v, startPosition, finalPosition)); 

      // Repeat till progress is complete. 
      if (t < 1) { 
       // Post again 16ms later. 
       handler.postDelayed(this, 16); 
      } 
     } 
    }); 
} 

Full code [here](https://gist.github.com/broady/6314689). 
関連する問題