Как переместить объект по трассе от начальной до конечной точки - PullRequest
0 голосов
/ 06 июля 2019

Пожалуйста, я знаю, если я использую текущее местоположение в то время, многие ответы, которые я видел.Но Мое местоположение приходит из службы, которая является главной проблемой.После обслуживания я получу все начальные и конечные точки.Теперь, как я могу оживить эту начальную точку до конечной точки?Я уже завершил перемещение индекса от 0 до 1 с анимацией, но остальное я не сделал.Теперь мне нужна помощь, чтобы решить эту проблему.

У меня есть местоположение, которое я получаю из своего сервиса, и я создаю карту маршрутов в Google Maps.Но теперь я хочу показать движущийся маркер или транспортное средство и анимировать его от начальной точки до конечной точки.

enter image description here

Как реализовать анимацию от начала до конца? Это мой метод, и я показываю начальную точку маршрута до концаточка с ломаной линией.

    private void setMapMarker(GoogleMap googleMap) {
    googleMap.clear();
    MapsInitializer.initialize(Objects.requireNonNull(getActivity()).getApplicationContext());
    api = ApiClient.getClient().create(ApiInterface.class);

    LocationInfo locationInfo = new LocationInfo();
    locationInfo.setMOV_DATE(fromDate.getText().toString());
    locationInfo.setEMPLOYE_ID(employeeID);
    locationInfo.setSTART_TIME(fromTime.getText().toString());
    locationInfo.setEND_TIME(toTime.getText().toString());

    Call<List<RouteList>> listCall = api.getLocation(locationInfo);
    APIHelper.enqueueWithRetry(listCall, new Callback<List<RouteList>>() {
        @Override
        public void onResponse(Call<List<RouteList>> call, Response<List<RouteList>> response) {
            try {
                if (response.isSuccessful()) {
                    List<RouteList> list = response.body();

                    Map<String, List<RouteList>> map = getEmployeeList(list);

                    if (list == null || list.isEmpty() || list.equals(0)) {
                        googleMap.clear();
                        Toast.makeText(getActivity(), "No data found", Toast.LENGTH_SHORT).show();
                    } else {
                        for (Map.Entry<String, List<RouteList>> entry : map.entrySet()) {
                            String employee = entry.getKey();
                            List<RouteList> list1 = map.get(employee);

                            if (list1.size() > 0) {

                                List<LatLng> latlng = new ArrayList<>();
                                for (int i = 0; i < list1.size(); i++) {
                                    double lat = Double.parseDouble(list1.get(i).getM_LATITUDE().trim());
                                    double lng = Double.parseDouble(list1.get(i).getM_LONGITDE().trim());
                                    String name = list1.get(i).getEMGIS_TIME();
                                    latlng.add(new LatLng(lat, lng));
                                    LatLng mLatlng = new LatLng(lat, lng);

                                    if (googleMap != null) {
                                        googleMap.addMarker(new MarkerOptions().position(mLatlng).title(name).snippet(""));
                                        cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), 12.0f);
                                       googleMap.animateCamera(cameraUpdate);

                                }

                                PolylineOptions rectOptions = new PolylineOptions().addAll(latlng);
                                rectOptions.color(generator.getRandomColor());
                                Objects.requireNonNull(googleMap).addPolyline(rectOptions);

                            }
            } catch (Exception e) {
                Toast.makeText(getActivity(), "Error:" + e, Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<List<RouteList>> call, Throwable t) {
            call.cancel();
            Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_LONG).show();
        }
    });
}

уже показывает карту маршрута.

1 Ответ

0 голосов
/ 06 июля 2019

Прежде всего, я хотел бы сказать, что вы должны быть более ясны в своем вопросе.

Важно знать, хотите ли вы установить маркер во время движения автомобиля. Я буду считать, что это то, что вы хотите сделать, и я дам ответ в соответствии с этим.


У вас уже есть метод, который устанавливает маркер -> setMapMarker

Все, что вам нужно сделать сейчас, это вызывать этот метод каждую секунду или около того.
Вы можете сделать это с помощью Thread, как показано ниже:

//Declare Thread
Thread thread;

void startSetMarker() {
    thread = new Thread() {
        @Override
        public void run() {
            try {
                while (!thread.isInterrupted()) {
                    Thread.sleep(1000);
                    runOnUiThread(new Runnable() {
                        @Override
                            public void run() {
                                //Call setMapMarker here
                            }
                        });
                    }
                } catch (InterruptedException e) {
            }
        }
    };
    thread.start();
}

//You can cancel the thread like this:

void cancelThread(){
    thread.interrupt();
}

При этом маркер будет обновляться каждую секунду.

Если вы хотите начать настройку маркера, вы можете позвонить по номеру startSetMarker();, а когда пользователь достигнет конечного пункта назначения, вы можете отменить поток, вызвав cancelThread();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...