2016-01-21 29 views
2

我正在构建一个android应用程序,我必须从一个日期/时间跟踪另一个用户并部署使用多段线的制造商? 作为对服务器的响应,我在列表中收到多个纬度/经度。现在我想像他们正在播放的视频一样一个一个地部署它们,我知道如何添加标记我只想控制那里部署.E标记A在部署2秒后部署,标记B应该部署并与具有聚标记C,D也是如此。等我应该如何能够实现这一目标。计时器,线程?任何帮助或参考,算法,将是伟大的,虽然我已经搜索了这样的例子,我找不到它。 在此先感谢控制标记部署。

回答

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

    } 
} 
+0

感谢Bhawna,但我真的很感激处理程序示例应用上的标记deployment.Since我从服务器端接收数据的较大块说45对LAT/LNGS的..我将如何应用处理程序。 – Nbi

+0

如果你看到它,请将我的答案标记为正确。谢谢 – Nbi

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点位置的对象,我们可以计算出2之间的轴承这是我们需要把在相机上转换到目标(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); 
}