【问题标题】:How to moving a object on route road from start to endpoint如何将路线上的对象从起点移动到终点
【发布时间】:2019-07-06 05:00:47
【问题描述】:

请知道我是否使用当前位置,那次我看到了很多答案。但是我的位置来自主要问题的服务。服务后,我将获得所有起点和终点。现在我怎样才能动画这个起点到终点?我已经完成了 0 索引到 1 索引的动画移动,但其余的我没有。现在我需要帮助来解决这个问题。

我有一个从我的服务中获得的位置,我在谷歌地图中创建了路线图。但现在我想显示一个移动的标记或车辆,并通过起点到终点对其进行动画处理。

如何实现从起点到终点的动画?这是 我的方法,我用一个显示路线起点到终点 折线。

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

已显示路线图。

【问题讨论】:

  • 我假设您想在车辆移动时移动标记?为此,您必须每秒左右获取纬度/经度,然后相应地更新标记。如果您想在不移动车辆的情况下对其进行动画处理,则需要获取起点和终点之间的纬度/经度位置并将标记移动到该点。
  • 我已经有了路线和标记。但我想在我的路线上显示一些动画。我更新的代码再次看到。谢谢
  • 您想在汽车行驶时显示动画吗?
  • 我有起点和终点。我也指明了路线。但我想展示一些从起点到终点的东西,就像汽车移动一样。
  • 看看我的第一条评论。

标签: android google-maps


【解决方案1】:

首先我想说你的问题应该更清楚。

重要的是要知道您是否要在车辆行驶时设置标记。我会假设这是你想要做的,我会根据这个提供答案。


你已经有一个设置标记的方法 -> setMapMarker

你现在需要做的就是每隔一秒左右调用一次这个方法。
你可以通过使用线程来做到这一点,如下所示:

//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(); 取消线程

【讨论】:

  • 非常感谢。首先我很欣赏你的回答。但是当我从我的服务中得到很长时间时,我该如何管理呢?
猜你喜欢
  • 2018-12-22
  • 2022-01-04
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多