控制标记部署。?

时间:2016-01-21 10:51:54

标签: android multithreading google-maps google-maps-markers

我正在构建一个Android应用程序,我必须在一个日期/时间跟踪用户,并逐个使用折线部署制造商? 作为对服务器的响应,我在列表中接收多个lat / lang。现在我想逐个部署它们,就像正在播放的视频我知道如何添加标记我只想控制部署.Eg标记A在2秒后部署标记B应该部署并与标记A连接聚合-line,标记C,D也是如此。我应该如何实现这一目标。定时器,线程?任何帮助或参考,algos,将是伟大的,虽然我搜索了这样的例子,我还没有找到它。 提前致谢

2 个答案:

答案 0 :(得分:0)

您可以使用Handler执行此任务。

我正在为您发布一个示例,我没有运行它,但我希望它能成功运行:

private final Handler mHandler = new Handler(Looper.getMainLooper());
private List<LatLng> mLatLngs;
private PutMarkerRunnable mRunnable;
private int mNoOfMarkersPlaced = -1;

private void showMarkers(List<LatLng> latLngs) {
    mLatLngs = latLngs;
    mHandler.post(mRunnable);
}

private class PutMarkerRunnable implements Runnable {
    @Override
    public void run() {
        // write code to add marker 
        map.addMarker();
        mNoOfMarkersPlaced++;
        if (mNoOfMarkersPlaced != mLatLngs.size()) {
            // scheduling next marker to be placed after 3 seconds
            mHandler.postDelayed(mRunnable, 3000);
        }

    }
}

答案 1 :(得分:0)

好的感谢社区..但我终于能够做到这一点了。标记正确,因为这对我有用!

首先,我们使用..来设置相机的动画。

    CameraPosition cameraPosition =
        new CameraPosition.Builder()
                .target(new LatLng(0,0))
                .bearing(45)
                .tilt(90)
                .zoom(googleMap.getCameraPosition().zoom)
                .build();

googleMap.animateCamera(
    CameraUpdateFactory.newCameraPosition(cameraPosition), 
    ANIMATE_SPEEED_TURN,
    new CancelableCallback() {

        @Override
        public void onFinish() {
        }

        @Override
        public void onCancel() {
        }
    }
);/**
 * 
 * Callback that highlights the current marker and keeps animating to the next marker, providing a "next marker" is still available.
 * If we've reached the end-marker the animation stops.
 * 
 */
CancelableCallback simpleAnimationCancelableCallback =
    new CancelableCallback(){

        @Override
        public void onCancel() {
        }

        @Override
        public void onFinish() {

            if(++currentPt < markers.size()){

                CameraPosition cameraPosition =
                        new CameraPosition.Builder()
                                .target(targetLatLng)
                                .tilt(currentPt<markers.size()-1 ? 90 : 0)
                                //.bearing((float)heading)
                                .zoom(googleMap.getCameraPosition().zoom)
                                .build();


                googleMap.animateCamera(
                        CameraUpdateFactory.newCameraPosition(cameraPosition), 
                        3000,
                        simpleAnimationCancelableCallback);

                highLightMarker(currentPt);

            }
        }
};

可以在2个android.location.Location对象之间计算方位。当我们在这里使用com.google.android.gms.maps.model.LatLng对象时,我们首先需要将它们转换为Location对象。

private Location convertLatLngToLocation(LatLng latLng) {
    Location location = new Location("someLoc");
    location.setLatitude(latLng.latitude);
    location.setLongitude(latLng.longitude);
    return location;
}

一旦我们有2个Location对象,我们就可以计算出2之间的方位。这是我们在转换到目标时需要放在Camera上的(endLocation)。

private float bearingBetweenLatLngs(LatLng beginLatLng,LatLng endLatLng) {
    Location beginLocation = convertLatLngToLocation(beginLatLng);
    Location endLocation = convertLatLngToLocation(endLatLng);
    return beginLocation.bearingTo(endLocation);
}

我们将使用该数字来计算中间点的坐标。一旦我们有了这些坐标,我们就会将跟踪标记设置为新的位置。

long elapsed = SystemClock.uptimeMillis() - start;
double t = interpolator.getInterpolation((float)elapsed/ANIMATE_SPEEED);

double lat = t * endLatLng.latitude + (1-t) * beginLatLng.latitude;
double lng = t * endLatLng.longitude + (1-t) * beginLatLng.longitude;

LatLng intermediatePosition = new LatLng(lat, lng);

trackingMarker.setPosition(intermediatePosition); 我们还将使用新的标记位置更新折线,在折线上创建拖尾效果。

private void updatePolyLine(LatLng latLng) {
    List<LatLng> points = polyLine.getPoints();
    points.add(latLng);
    polyLine.setPoints(points);
}