2013-02-22 105 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); 
} 
相關問題