我希望在 map 上像 UBER 一样对多辆汽车(标记)进行动画/移动,同时当 API 响应到来时,每 10 秒通过 API 调用获取它们的更新位置,我想在他的方向上对每辆汽车(标记)进行动画/移动。
现在,我能够顺利地制作动画/移动一辆车(标记)。但当它们有多个时,我会通过保留它们的旧位置来挣扎
int driverArraySize = driverArray.length();
for (int i = 0; i < driverArraySize; i++){
JSONObject driverJson = driverArray.getJSONObject(i);
String driver_id = driverJson.getString("_id");
JSONArray driverLocation = driverJson.getJSONArray("driverLocation");}
我的数组包含驱动程序 ID 及其当前位置,我可以使用这些数据来制作动画/移动吗?
private void animateCars(final Marker marker, final LatLng beganPosition, final LatLng finalPosition, final LatLngInterpolator latLngInterpolator) {
if (marker != null) {
final LatLng startPosition = new LatLng(beganPosition.latitude, beganPosition.longitude);
final LatLng endPosition = new LatLng(finalPosition.latitude, finalPosition.longitude);
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
valueAnimator.setDuration(20000); // duration in second
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
@Override
public void onAnimationUpdate(ValueAnimator animation){
try {
float v = (float) animation.getAnimatedValue();
LatLng newPosition = latLngInterpolator.interpolate(v, startPosition, endPosition);
marker.setPosition(newPosition);
marker.setAnchor(0.5f, 0.5f);
Float rotation = getBearing(startPosition, new LatLng(finalPosition.latitude, finalPosition.longitude));
if (!Float.isNaN(rotation)) {
marker.setRotation(rotation);
}
} catch (Exception ex) {
//I don't care atm..
}
}
});
valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
valueAnimator.start();
}
}
public static 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;
}
这是我用于动画的代码
最佳答案
寻找这两个选项。他们可能会有所帮助
关于java - 像 UBER 一样在 map 上动画/移动多辆汽车(标记),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597233/