2017-09-26 9 views
0

私はマップナビゲーションアプリケーションを実装しています。私はデバイスの現在の位置を1000ミリ秒ごとに取得し、現在の位置から固定マーカーポイントまでポリラインを描画します。しかし、車内でデバイスを使用する場合、ポリラインや現在地の更新は、uberやgoogle-mapのようにアニメートされません。突然1つのポイントから別のポイントに変化しています。Googleマップで現在地のスムーズな動きを表示する方法android

現在の位置の変化を円滑にする方法。

+0

間のベアリングを見つけるため。あなたの場合は、速度と方向を計算して位置を外挿する必要があります。それはそれを行うライブラリが存在する可能性があります。 –

答えて

3

あなたはそれが注意

あなた

private void animateMarkerNew(final LatLng startPosition, final LatLng destination, final Marker marker) { 

     if (marker != null) { 

      final LatLng endPosition = new LatLng(destination.latitude, destination.longitude); 

      final float startRotation = marker.getRotation(); 
      final LatLngInterpolatorNew latLngInterpolator = new LatLngInterpolatorNew.LinearFixed(); 

      ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1); 
      valueAnimator.setDuration(2000); // duration 3 second 
      valueAnimator.setInterpolator(new LinearInterpolator()); 
      valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator animation) { 
        try { 
         float v = animation.getAnimatedFraction(); 
         LatLng newPosition = latLngInterpolator.interpolate(v, startPosition, endPosition); 
         marker.setPosition(newPosition); 
         googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder() 
           .target(newPosition) 
           .zoom(18f) 
           .build())); 

         marker.setRotation(getBearing(startPosition, new LatLng(destination.latitude, destination.longitude))); 
        } catch (Exception ex) { 
         //I don't care atm.. 
        } 
       } 
      }); 
      valueAnimator.addListener(new AnimatorListenerAdapter() { 
       @Override 
       public void onAnimationEnd(Animator animation) { 
        super.onAnimationEnd(animation); 

        // if (mMarker != null) { 
        // mMarker.remove(); 
        // } 
        // mMarker = googleMap.addMarker(new MarkerOptions().position(endPosition).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car))); 

       } 
      }); 
      valueAnimator.start(); 
     } 
    } 
を助けるこの方法を試してみて:マーカーを使用すると、その1をアニメーション化したいマーカーの平均です。

private interface LatLngInterpolatorNew { 
     LatLng interpolate(float fraction, LatLng a, LatLng b); 

     class LinearFixed implements LatLngInterpolatorNew { 
      @Override 
      public LatLng interpolate(float fraction, LatLng a, LatLng b) { 
       double lat = (b.latitude - a.latitude) * fraction + a.latitude; 
       double lngDelta = b.longitude - a.longitude; 
       // Take the shortest path across the 180th meridian. 
       if (Math.abs(lngDelta) > 180) { 
        lngDelta -= Math.signum(lngDelta) * 360; 
       } 
       double lng = lngDelta * fraction + a.longitude; 
       return new LatLng(lat, lng); 
      } 
     } 
    } 

//メソッドあなたがより正確に1秒以上表示できない二つの点

private float getBearing(LatLng begin, LatLng end) { 
    double lat = Math.abs(begin.latitude - end.latitude); 
    double lng = Math.abs(begin.longitude - end.longitude); 

    if (begin.latitude < end.latitude && begin.longitude < end.longitude) 
     return (float) (Math.toDegrees(Math.atan(lng/lat))); 
    else if (begin.latitude >= end.latitude && begin.longitude < end.longitude) 
     return (float) ((90 - Math.toDegrees(Math.atan(lng/lat))) + 90); 
    else if (begin.latitude >= end.latitude && begin.longitude >= end.longitude) 
     return (float) (Math.toDegrees(Math.atan(lng/lat)) + 180); 
    else if (begin.latitude < end.latitude && begin.longitude >= end.longitude) 
     return (float) ((90 - Math.toDegrees(Math.atan(lng/lat))) + 270); 
    return -1; 
} 
+2

私はこれがある点をランダムに任意の方向に別の点にアニメーションすると思う、それはパスを気にしない..私はパスを介してアニメーションしたい。出来ますか? – ChyperX

+0

あなたはパスの平均ポリラインを右に、ポリラインには緯度と経度があります。ここで開始位置はマーカ位置、デスティネーションポイントは次のポリラインです。これがうまくいくことを願っています – Raja

+0

@Rajaこのソリューションはまっすぐなポリラインで動作するかもしれませんが、ハッシュマップパスやGoogleから2つのポイント間のルートを表示する道路では機能しません。 –

関連する問題