java - 像 UBER 一样在 map 上动画/移动多辆汽车(标记)

标签 java android xml kotlin material-design

我希望在 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/

相关文章:

java - Spark RDD- map 与 mapPartitions

android - Zxing 2.2 和 R.id 错误

android - 从谷歌播放服务获取日期

android - 为企业单击一次 Android 应用程序安装/升级

javascript - 使用 javascript 在另一个 URL 上运行 GET、检索返回的 xml 并查找特定节点的示例?

java - setContentView R.layout

java - NetBeans 中文件名后面的 [-/M] 表示什么?

c# - 为什么在某些风格中,后视中的有限重复不起作用?

c# - 只允许匿名用户访问登录和注册页面

java - Android 应用未在其他设备上运行