Ниже я добавляю маркер на карту и каждые 15 секунд обновляю его и получаю новую широту и долготу из базы данных. Маркер (Bus Image) успешно добавляется на карту и плавно перемещается из одной позиции в другую, как машина едет по дороге. Теперь то, что я хочу, я хочу повернуть маркер автобуса в соответствии с направлением. Как мне этого добиться? Я не понимаю, каково значение toRotation и st?

public Runnable runLocation = new Runnable() {
        @Override
        public void run() {
            gps = new GPSTracker(MapActivity.this);
            MyLocation1.clear();
            if (gps.CanGetLocation()) {
                double latitude = gps.getLatitude();
                double longitude = gps.getLongitude();
                LatLng mylocation = new LatLng(latitude, longitude);
                if (marker != null) {
                    marker.remove();
                }
                if (circle != null) {
                    circle.remove();
                }
                if (busMarker != null){
                    lastBusPos = busMarker.getPosition();
                }

                marker = mMap.addMarker(new MarkerOptions()
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.location))
                        .title("My Location")
                        .position(mylocation));

                circle = mMap.addCircle(new CircleOptions()
                        .center(mylocation)
                        .radius(1000)
                        .strokeColor(0x10000000)
                        .fillColor(0x10000000));
            } else {
                // gps.showSettingsAlert();
            }

            String tag_json_obj = "json_obj_req";
            String url = AppConfig.RouteData + "i=1&" + "y=1";

            JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    try {

                        JSONObject jObj = new JSONObject(String.valueOf(response));
                        JSONArray json_user = jObj.getJSONArray("Message");
                        for (int i = 0; i < json_user.length(); i++) {

                            try {

                                JSONObject obj = json_user.getJSONObject(i);

                                final Double currLat = obj.getDouble("actual_lat");
                                final Double currLong = obj.getDouble("actual_long");
                                final LatLng hcmus = new LatLng(currLat, currLong);


                                List<LatLng> latList = new ArrayList<LatLng>();
                                latList.add(hcmus);

                                if (mMarkers.size() != json_user.length()) {
                                    busMarker = mMap.addMarker(new MarkerOptions()
                                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus))
                                            .title("Bus No" + obj.getString("bus_id"))
                                            .position(hcmus));
                                    mMarkers.add(busMarker);
                                } else {
                                    //busMarker.setPosition(hcmus);
                                    animateMarker(hcmus, false);
                                    rotateMarker(busMarker, 45.0f, 45.0f);
                                }

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MapActivity.this, "Sorry something went wrong..Try again", Toast.LENGTH_SHORT).show();
                }
            });

            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);

            MapActivity.this.handler.postDelayed(MapActivity.this.runLocation, 15000);
        }

    };

    /*-------------------------------Animation----------------------------*/
    public void rotateMarker(final Marker marker, final float toRotation, final float st) {
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        final float startRotation = st;
        final long duration = 1555;

        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);

                float rot = t * toRotation + (1 - t) * startRotation;

                marker.setRotation(-rot > 180 ? rot / 2 : rot);
                if (t < 1.0) {
                    // Post again 16ms later.
                    handler.postDelayed(this, 16);
                }
            }
        });
    }

    public void animateMarker(final LatLng toPosition,final boolean hideMarke) {
        final Handler handler = new Handler();
        final long start = SystemClock.uptimeMillis();
        Projection proj = mMap.getProjection();
        Point startPoint = proj.toScreenLocation(lastBusPos);
        final LatLng startLatLng = proj.fromScreenLocation(startPoint);
        final long duration = 5000;

        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;
                busMarker.setPosition(new LatLng(lat, lng));

                if (t < 1.0) {
                    // Post again 16ms later.
                    handler.postDelayed(this, 16);
                } else {
                    if (hideMarke) {
                        busMarker.setVisible(false);
                    } else {
                        busMarker.setVisible(true);
                    }
                }
            }
        });
    }

    /*--------------------------------------------------------------------*/
6
Moin Khan 5 Апр 2017 в 10:12

2 ответа

Лучший ответ

Вы можете ссылаться в этой связанной теме. Используйте подшипник объекта Location, а затем установите его на CameraPosition.

Если вы используете GPS для определения местоположения пользователя, то Location объект, который вы вход в onLocationChanged содержит подшипник.

Если у вас есть только две координаты (например, у вас есть только координаты от поставщика сетевых расположений), вы можете использовать Location.bearingTo() для Рассчитаем азимут двух координат:

Location prevLoc = ... ;
Location newLoc = ... ;
float bearing = prevLoc.bearingTo(newLoc) ;

Если у вас есть подшипник, вы можете установить вращение маркера, используя MarkerOptions.rotation() :

mMap.addMarker(new MarkerOptions()
                    .position(markerLatLng)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.map_marker))
                    .anchor(0.5f, 0.5f)
                    .rotation(bearing)
                    .flat(true));

Вы должны установить привязать к точке, которую вы хотите повернуть вокруг, и это также точка, которую вы хотите быть в позиции, которую вы установили к маркеру. (0.5, 0.5) - центр изображения.

Вот некоторые сообщения, которые также могут помочь:

12
Community 23 Май 2017 в 12:02

Попробуйте код ниже. Это очень легко реализовать.

Здесь latLng1 = old ваше местоположение & latLng2 = ваше новое местоположение.

< Сильный > Шаг = 1

 private double getBearingBetweenTwoPoints1(LatLng latLng1, LatLng latLng2) {

        double lat1 = degreesToRadians(latLng1.latitude);
        double long1 = degreesToRadians(latLng1.longitude);
        double lat2 = degreesToRadians(latLng2.latitude);
        double long2 = degreesToRadians(latLng2.longitude);


        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 radiansBearing = Math.atan2(y, x);


        return radiansToDegrees(radiansBearing);
    }

< Сильный > Шаг = 2

private double degreesToRadians(double degrees) {
        return degrees * Math.PI / 180.0;
    }

< Сильный > Шаг = 3

private double radiansToDegrees(double radians) {
    return radians * 180.0 / Math.PI;
}

Шаг = 4 . Установите поворот маркера.

 mPositionMarker.setRotation((float) getBearingBetweenTwoPoints1(new LatLng(lastLocLati, lastLocLongi), new LatLng(lati, longi)));
0
Jiks 22 Мар 2018 в 09:04