0

Google Map Androidで特定の速度(kmph単位)でマーカーをアニメーション化する方法。特定の速度でLatLngの配列の間でマーカーを移動する

私はインターネットで広く利用可能なanimateMarkerメソッドを試しました。 LatLng点のセットを移動できますが、特定の速度では移動できません。

誰かがあなたがここにPhysicsを使用する必要がありますKMPH

答えて

1

内の特定の速度でオブジェクトを移動するには私を助けることができます。以下は、役に立つアルゴリズムのような詳細です。

  1. 最初の位置から最後の位置まで消費する時間を確認します。 Velocity17 km/hrで、最初と最後の位置の間の距離が10 kmの場合、時間は3600 secまたは3600000 msとなります。
  2. Arrayの各地域の時間を分割してください。あなたがArrayで100個の要素を持っている場合は、それぞれの場所の間の時間が今36 secまたは36000 msに設定した時間でHandlerを定義し、この期間内にマーカーをアニメーション化しようと36 secまたは36000 ms
  3. になりましょう。そのためには、別のHandlerや、APIによって提供されるデフォルトのメソッドを使用することができます。毎回次の場所に配列の要素があることを思い出してください。

NOTE

私も例を見つけました。元の投稿はhereを参照してください。

public void animateMarker(final Marker marker, final LatLng toPosition, 
     final boolean hideMarker) { 
    final Handler handler = new Handler(); 
    final long start = SystemClock.uptimeMillis(); 
    Projection proj = mGoogleMapObject.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); 
       } 
      } 
     } 
    }); 
} 

誰でも助けてください。

0

これを達成するために同じ方法を変更しました。私たちは、

animateMarker(googleMap, driver, arrayPoints, distance(arrayPoints.get(0), arrayPoints.get(1)) * msForKMTravel, 0); 

arrayPointsこのメソッドを呼び出す必要が

は、緯度経度の配列です。 msForKMTravelは、KMをトラブリングするためのmicroSecです。

方法:::

public void animateMarker(final GoogleMap mMap, final Marker marker, final List<LatLng> arrayLications, final double duration, final int step) { 
     Log.d(TAG, "Moving from:" + step + "To:" + (step + 1) + "duration" + duration); 
     final Handler handler = new Handler(); 
     final long start = SystemClock.uptimeMillis(); 
     LatLng startPosition = arrayLications.get(step); 
     final LatLng toPosition = arrayLications.get(step + 1); 
     Projection proj = mMap.getProjection(); 
     Point startPoint = proj.toScreenLocation(startPosition); 
     final LatLng startLatLng = proj.fromScreenLocation(startPoint); 

     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)); 
       Log.d(TAG, "interpolator t:" + t + "start :" + start + " elapsed :" + elapsed); 
       double lng = t * toPosition.longitude + (1 - t) 
         * startLatLng.longitude; 
       double lat = t * toPosition.latitude + (1 - t) 
         * startLatLng.latitude; 
       LatLng newLatLng = new LatLng(lat, lng); 
       Log.d(TAG, "Moving to" + newLatLng); 
       marker.setPosition(newLatLng); 

       if (t < 1.0) { 
        handler.postDelayed(this, 100); 
       } else { 
        if (arrayLications.size() > step + 2 && isVisible()) { 
         double distance = distance(arrayLications.get(step + 1), arrayLications.get(step + 2)); 
         double time = distance * msForKMTravel; 
         Log.d(TAG, "Go for distance" + distance + " in time " + time); 
         animateMarker(mMap, marker, arrayLications, time, step + 1); 
        } 
       } 
      } 
     }); 
    } 
+0

この質問のために利用できるよりよい解決策があるかどうかわからないと私は答えとしてこれをマークすることはできません。 – Pavandroid

関連する問題