2017-09-26 173 views
0

我正在实现一个地图导航应用程序。我每1000毫秒获取设备的当前位置,并绘制一条从当前位置到固定标记点的折线。但是,当在车内使用设备时,折线和当前位置更新不像超级或谷歌地图那样具有动画效果。它从一个点突然改变到另一个。如何在谷歌地图中显示当前位置的平滑移动android

如何获得当前位置变化的平滑动画。

+0

不能超过1秒显示更精确地找到之间的轴承。在你的情况下,你可能需要通过计算速度和方向来推断位置。它可能存在一个可以做到这一点的库。 –

回答

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

注:标记为要进行动画处理的一个标志,其平均。

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

//方法两点

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我认为他是正确的,因为这种解决方案可能在直线多段线上工作,但它不适用于我们从谷歌获得的散列表路径或道路,以显示两点之间的路线。 –

相关问题