我已经在我的位置上放置了一个标记。我希望能够像谷歌地图应用程序一样平稳地移动我的标记。当我开车时,蓝色圆圈移动得非常平滑。我想在我的应用程序中实现相同的效果。我该如何在我的应用程序中实现这一点?
目前,我的位置标记只会在每次位置变化时跳跃到不同的位置并标记那里。
以下是我所做的:
每次调用我的位置时,标记都会被移除并调用我的位置方法,然后在新的位置创建标记。而我想要像谷歌地图一样获得标记的平滑过渡。如何实现?
更新:
在多次尝试后,我最终写出了以下代码,但我的标记没有显示:
我正在使用下面的方法,并在每次 myLocation 方法中调用它。
目前,我的位置标记只会在每次位置变化时跳跃到不同的位置并标记那里。
以下是我所做的:
googleMap.setMyLocationEnabled(true);
因此,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);
}
在我的位置方法中:
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);
}
每次调用我的位置时,标记都会被移除并调用我的位置方法,然后在新的位置创建标记。而我想要像谷歌地图一样获得标记的平滑过渡。如何实现?
更新:
在多次尝试后,我最终写出了以下代码,但我的标记没有显示:
我正在使用下面的方法,并在每次 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);
}
}
}
});
}
谢谢!