如何在Google Maps v2 android中顺利保持移动当前位置标记

The*_*Man 9 android google-maps google-maps-android-api-2

我为我的位置放了一个标记.我想顺利地移动我的标记,就像Google地图应用程序一样.当我继续在车里行驶时,蓝色圆圈移动得非常顺畅.我想为我的应用实现相同的功能.我如何在我的应用程序上实现这一点?

截至目前,我的位置标记只是在非常位置变化时跳转到不同位置并在那里标记标记.

这就是我所做的:

 googleMap.setMyLocationEnabled(true);
Run Code Online (Sandbox Code Playgroud)

因此自动调用onMyLocationChange方法:

@Override
public void onMyLocationChange(Location location) 
{
    curlat = location.getLatitude();
    curlong = location.getLongitude();

    if (markermylocation != null)
    {
        markermylocation.remove();
    }

        curlat = location.getLatitude();
        curlong = location.getLongitude();
        myLocation(curlat, curlong, username, imageURL, ZOOMVALUE);
}
Run Code Online (Sandbox Code Playgroud)

在mylocaiton方法:

private void myLocation(double lat, double lng, String name, String url, float zoom)
{
    if(firsttime  == 1)
    {
        LatLng ll = new LatLng(lat,lng);
        CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, zoom);
        googleMap.animateCamera(update);
        firsttime = 0;
    }

    final String uname = name; 
    curlat = lat;
    curlong = lng;
    LatLng position = new LatLng(curlat, curlong);

    markerOptionsmylocaiton = new MarkerOptions().position(position).icon(BitmapDescriptorFactory.fromBitmap(icon)).title(uname).anchor(0.5f, 1f);
    markermylocation = googleMap.addMarker(markerOptionsmylocaiton);

    LatLng latlang = new LatLng(curlat, curlong);
    animateMarker(markermylocation, latlang, false);
}
Run Code Online (Sandbox Code Playgroud)

因此,每次调用mylocation时,标记都会被删除并调用mylocation方法,然后在新的postition中创建标记.相反,我想像谷歌地图一样顺利过渡标记?怎么实现这个?

更新:

经过几次这样的工作:我最终来到这个代码,但后来我的标记没有出现:

我使用下面的方法,每次在myLocation方法中调用它.

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

谢谢!

dan*_*117 1

您必须在位置的新纬度和标记的当前纬度之间使用插值器(线性插值器或加速度插值器)。这是一个带有反弹插值器的示例。

final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        final long duration = 2500;

        final Interpolator interpolator = new BounceInterpolator();
        marker.setVisible(true);

        handler.post(new Runnable() {
            @Override
            public void run() {
                long elapsed = SystemClock.uptimeMillis() - start;
                float t = Math.max(
                        1 - interpolator.getInterpolation((float) elapsed
                                / duration), 0);

                marker.setAnchor(0.5f, 1.0f + 6 * t);
                marker.setPosition(latlng)

                if (t > 0.0) {
                    // Post again 16ms later.
                    handler.postDelayed(this, 16);
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)