在具有特定速度的LatLng阵列之间移动标记

时间:2017-05-02 03:31:12

标签: android google-maps google-maps-markers google-maps-android-api-2

如何在Google Map Android上以kmph的特定速度为数组制作标记。

我尝试了 animateMarker 方法,该方法在互联网上广泛使用。能够通过一组LatLng点移动但不能以特定的速度移动。

有人可以帮我在KMPH中以特定的速度移动物体

2 个答案:

答案 0 :(得分:1)

您可能必须在此处使用Physics。下面是一个类似算法的细节,可能会有所帮助。

  1. 找出从第一个位置到最后一个位置应该消耗的时间。让我们说Velocity17 km/hr,第一个和最后一个位置之间的距离是10 km,那么时间将是3600 sec3600000 ms
  2. 现在划分Array中每个位置的时间。我们假设如果Array中有100个元素,则每个位置之间的时间间隔为36 sec36000 ms
  3. 现在定义Handler,其持续时间设置为36 sec36000 ms,并尝试在此持续时间内制作标记动画。为此,您可以使用他Handler提供的其他API或默认方法。回想一下,你的数组中每次都有下一个位置的元素。
  4. 注意

    我也找到了一个例子。有关原始帖子,请参阅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);
                    }
                }
            }
        });
    }
    

    希望其中的任何人都有所帮助。

答案 1 :(得分:0)

我修改了相同的方法来实现这一目标。

我们需要调用此方法

match_phrase

arrayPoints是LatLng数组。 msForKMTravel是用于移植KM的microSec。

方法:::

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