2013-02-22 73 views
3

我有一个包含在应用程序中的地图。我需要地图放大标记和用户位置,但保持标记居中。放大效果非常好,但当然不会将标记居中在地图上。Android Maps API v2:放大当前位置和标记

@Override 
public void onLocationChanged(Location location) { 
    if (mListener != null) { 
     mListener.onLocationChanged(location); 

     LatLngBounds bounds = new LatLngBounds.Builder() 
     .include(new LatLng(location.getLatitude(),location.getLongitude())) 
     .include((new LatLng(52.3563, 4.8790))) 
     .build(); 

     mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 35)); 


    } 
} 

什么是最好的方法来保持在界限内,但保持标记居中?我似乎无法在官方文档中找到解决方案。

回答

0

设置边界 -

的方法的过载,newLatLngBounds(边界,宽度,高度,填充)允许
你指定以像素为宽度和高度为矩形,具有它们的意图是这些对应于地图的尺寸​​。该矩形位于,其中心与地图视图的中心相同(因此,如果指定的尺寸与地图视图的尺寸相同,则矩形与地图视图重合)。返回的CameraUpdate将移动相机,以便在尽可能最大的缩放级别下,在指定的LatLngBounds在给定矩形的屏幕中居中,并考虑所需的填充。
参考 - https://developers.google.com/maps/documentation/android/views#target_location

+0

也许我失去了一些东西,但我不看到,把标记本身在屏幕的中心与用户位置在界限内的任何其他地方。 – 2013-02-22 11:30:35

6

有两个函数我会打电话,一为中心的标志和另外一个在地图上放大,直到你的当前位置仍然可见。

我进行缩放以点带15缩放级别的解决方案:

myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngToCenter, 1)); 

缩放,直到所有标记仍清晰可见(改变代码以适应标记和你的职位,而不是):

public void fitZoomAndPositionToMapByMarkers() { 

    int minLat = Integer.MAX_VALUE; 
    int maxLat = Integer.MIN_VALUE; 
    int minLon = Integer.MAX_VALUE; 
    int maxLon = Integer.MIN_VALUE; 

    List<MyMapMarker> markersShownOnMap = getMarkersToShow(); 

    for (MyMapMarker item : markersShownOnMap) { 

     int lat = (int) (item.getLatitude() * 1E6); 
     int lon = (int) (item.getLongitude() * 1E6); 

     maxLat = Math.max(lat, maxLat); 
     minLat = Math.min(lat, minLat); 
     maxLon = Math.max(lon, maxLon); 
     minLon = Math.min(lon, minLon); 
    } 

    double latitudeToGo = (maxLat + minLat)/1E6/2; 
    double longitudeToGo = (maxLon + minLon)/1E6/2; 
    LatLng toCenter = new LatLng(latitudeToGo, longitudeToGo); 

    centerCameraToProperPosition(toCenter); 

    LatLng southWestLatLon = new LatLng(minLat/1E6, minLon/1E6); 
    LatLng northEastLatLon = new LatLng(maxLat/1E6, maxLon/1E6); 

    zoomInUntilAllMarkersAreStillVisible(southWestLatLon, northEastLatLon); 
} 

希望这有助于!

private void zoomInUntilAllMarkersAreStillVisible(final LatLng southWestLatLon, final  LatLng northEastLatLon) { 

    myMap.setOnCameraChangeListener(new OnCameraChangeListener() { 

     @Override 
     public void onCameraChange(CameraPosition arg0) { 

      myMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(southWestLatLon, northEastLatLon), 50)); 
      myMap.setOnCameraChangeListener(null); 

     } 
    }); 

} 
+0

myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngToCenter,1));为我工作:)谢谢 – 2013-05-09 08:55:43

+0

很高兴听到这个:) – Analizer 2013-05-09 08:58:17

+0

centerCameraToProperPosition(toCenter);它在哪里定义? – Ali 2016-03-09 09:37:53

2

你好,我发现使用的LatLngBounds一个很好的和简单的方法:

googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(latlngSW, latlngNE, 50)); 

此功能将使用最SW点和最NE点来创建一个矩形50填充到中心看,但你必须先检查该点之一应该给作为第一或第二个参数,这里是我的代码:

public void centerMap(LatLng latLng){ 
    if(fenceMarker != null){ 
     LatLngBounds center; 
     LatLng fence = fenceMarker.getPosition(); 
     if(fence.latitude < latLng.latitude || fence.longitude < latLng.longitude) 
      center = new LatLngBounds(fenceMarker.getPosition(), latLng); 
     else{ 
      center = new LatLngBounds(latLng, fenceMarker.getPosition()); 
     } 
     googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(center, 50)); 
    } 
} 

2点是我的位置的latLng和我有标记GeoFence,fenceMarker。

我从onLocationChanged()调用此函数centerMap(的latLng):

@Override 
public void onLocationChanged(Location location) { 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    centerMap(latLng); 
} 
相关问题