【问题标题】:Animate/move multiple cars(markers) on map like UBER在 UBER 等地图上为多辆汽车(标记)设置动画/移动
【发布时间】:2020-01-05 05:17:46
【问题描述】:

我希望像 UBER 一样在地图上为多辆汽车(标记)设置动画/移动,同时我每 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 android xml kotlin material-design


【解决方案1】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多