在谷歌地图android中沿路径设置汽车(标记)动画
如果您有列表,我将分享沿路径移动标记的解决方案。位图将从使用LatLng列表沿路径移动。在谷歌地图android中沿路径设置汽车(标记)动画,android,android-maps-v2,Android,Android Maps V2,如果您有列表,我将分享沿路径移动标记的解决方案。位图将从使用LatLng列表沿路径移动。public static void setAnimation(谷歌地图myMap,最终列表方向点,最终位图){ public static void setAnimation(GoogleMap myMap, final List<LatLng> directionPoint, final Bitmap bitmap) { Marker marker = myMap.addMarke
public static void setAnimation(谷歌地图myMap,最终列表方向点,最终位图){
public static void setAnimation(GoogleMap myMap, final List<LatLng> directionPoint, final Bitmap bitmap) {
Marker marker = myMap.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.fromBitmap(bitmap))
.position(directionPoint.get(0))
.flat(true));
myMap.animateCamera(CameraUpdateFactory.newLatLngZoom(directionPoint.get(0), 10));
animateMarker(myMap, marker, directionPoint, false);
}
private static void animateMarker(GoogleMap myMap, final Marker marker, final List<LatLng> directionPoint,
final boolean hideMarker) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = myMap.getProjection();
final long duration = 30000;
final Interpolator interpolator = new LinearInterpolator();
handler.post(new Runnable() {
int i = 0;
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed
/ duration);
if (i < directionPoint.size())
marker.setPosition(directionPoint.get(i));
i++;
if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 16);
} else {
if (hideMarker) {
marker.setVisible(false);
} else {
marker.setVisible(true);
}
}
}
});
}
Marker Marker=myMap.addMarker(新MarkerOptions()
.icon(BitmapDescriptorFactory.fromBitmap(位图))
.位置(方向点.get(0))
.平坦(真实));
myMap.animateCamera(CameraUpdateFactory.newLatLngZoom(directionPoint.get(0),10));
animateMarker(myMap、marker、directionPoint、false);
}
私有静态void animateMarker(谷歌地图myMap、最终标记、最终列表方向点、,
最终布尔hideMarker){
最终处理程序=新处理程序();
最终长启动=SystemClock.uptimeMillis();
Projection proj=myMap.getProjection();
最终长持续时间=30000;
最终插值器插值器=新的线性插值器();
handler.post(新的Runnable(){
int i=0;
@凌驾
公开募捐{
长时间运行=SystemClock.uptimeMillis()-开始;
float t=interpolator.getInterpolation((float)经过
/持续时间);
if(i
我也完成了相同的场景,这里给出了代码
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, LocationListener {
private static Location oldLocation;
private GoogleMap mMap;
private LocationManager locationManager;
private Marker marker;
private static float angle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
Toast.makeText(this, "Location permissioin in not enable", Toast.LENGTH_SHORT).show();
return;
}
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2, 0, this);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
}
@Override
public void onLocationChanged(Location location) {
locationUpdate(location);
if (oldLocation != null) {
double bearing = angleFromCoordinate(oldLocation.getLatitude(), oldLocation.getLongitude(), location.getLatitude(), location.getLongitude());
changeMarkerPosition(bearing);
}
oldLocation = location;
}
private void locationUpdate(Location location) {
LatLng latLng = new LatLng((location.getLatitude()), (location.getLongitude()));
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title("Current Position");
markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.car_right));
mMap.clear();
marker = mMap.addMarker(markerOptions);
CameraPosition position = CameraPosition.builder()
.target(new LatLng(location.getLatitude(), location.getLongitude()))
.zoom(19)
.tilt(30)
.build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(position));
}
private void changeMarkerPosition(double position) {
float direction = (float) position;
Log.e("LocationBearing", "" + direction);
if (direction==360.0){
//default
marker.setRotation(angle);
}else {
marker.setRotation(direction);
angle=direction;
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
private double angleFromCoordinate(double lat1, double long1, double lat2,
double long2) {
double dLon = (long2 - long1);
double y = Math.sin(dLon) * Math.cos(lat2);
double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
* Math.cos(lat2) * Math.cos(dLon);
double brng = Math.atan2(x, y);
brng = Math.toDegrees(brng);
brng = (brng + 360) % 360;
brng = 360 - brng;
return brng;
}}
希望这会有所帮助。您的帖子应该以问题的形式发布,以便为多段线路线设置动画github.com/amalChandran/google-maps-route-animation您能向我解释一下列表方向点包含哪些内容吗?感谢从源到目标的车位列表,其中汽车(标记器)需要沿mapI设置动画。我正在根据另一个应用程序的实时位置更新设置汽车位置动画。那么,当我只有当前位置时,如何获得LatLng列表?有没有一种方法可以延迟应用程序的绘制,以收集一些更新,然后将所有更新添加到列表对象,并将其传递给您的方法,并继续重复,直到最终目的地?嗨,Martain,我的要求是在地图上从源到目的地设置汽车动画,这不是实时的。在您的情况下,这是实时的,因此您不需要使用我的功能而是根据当前位置更新标记,并显示和隐藏标记,以创建移动汽车+1的错觉,谢谢。您的代码与本要点的区别是什么: