我一直在尝试构建一个使用包含纬度和经度的json数据的应用,创建多个标记并将它们固定到地图上。
一切顺利,除了这种奇怪的行为 - 在初始加载时,地图相机超出范围。
如果应用程序进入后台,并且在恢复时,相机焦点现在正确。
这是我用来创建标记以及定义边界的代码。
private void setUpMapIfNeeded(ArrayList<MarkerObject> mapMarkers2) {
if(mMap == null) {
mMapFragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
mMap = mMapFragment.getMap();
if(mMap != null) {
/*setUpMap(mapMarkers);
Log.i(TAG,"SetUpMap is called");*/
for(int i=0; i<mapMarkers2.size(); i++) {
customMarker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(mapMarkers.get(i).getLatitude(), mapMarkers.get(i).getLongitude()))
.title(mapMarkers.get(i).getName())
.snippet(mapMarkers.get(i).getContact()));
}
//Required for focusing the camera
final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
if(mapView.getViewTreeObserver().isAlive()) {
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
/*LatLngBounds bounds = new LatLngBounds.Builder()
.include(markerLatLng).build();*/
LatLngBounds.Builder bld = new LatLngBounds.Builder();
for(int i=0; i<mapMarkers.size(); i++) {
LatLng ll = new LatLng(mapMarkers.get(i).getLatitude(), mapMarkers.get(i).getLongitude());
bld.include(ll);
}
LatLngBounds bounds = bld.build();
/*if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}else {
mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
*/
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,10));
//mMap.animateCamera(CameraUpdateFactory.zoomIn());
mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Log.i(TAG,"Camera position: "+ mMap.getCameraPosition());
}
});
}
}
}
}
为什么会出现这种奇怪的行为?
答案 0 :(得分:0)
尝试在onMapLoaded侦听器中调用moveCamera
:
mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
// moveCamera here
}
});
答案 1 :(得分:0)
删除全局树观察者,添加标记,使用所有点创建LatLng []并使用下面的代码缩放到地图上的所有点。我为增加一个漂亮的填充添加了一点奖励。 (如果愿意,也可以在onResume上调用此方法)
public void zoomToPoints(LatLng... geoPoint){
LatLngBounds.Builder b = new LatLngBounds.Builder();
for (LatLng m : geoPoint)
{
if (m != null)
b.include(m);
}
LatLngBounds bounds = b.build();
int padding = (int) (Math.min(DEVICE_WIDTH, DEVICE_HEIGHT) * 0.1);
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
mMap.animateCamera(cu);
}
我还建议添加一个处理程序来延迟map init以避免主线程错开,特别是如果你使用了很多引脚。在OnCreate中构建地图并延迟绘制引脚。
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
drawPinsAndZoom();
}
}, 500);
答案 2 :(得分:0)
在内部尝试Catch移动animateCamera和Cameraupdatefactory解决了这个问题。这是代码
try{
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(llb,15));
}catch (IllegalStateException e) {
e.printStackTrace();
final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
Log.i(TAG,"MapView is obtained ");
if(mapView.getViewTreeObserver().isAlive()) {
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
mapView.getViewTreeObserver()
.removeGlobalOnLayoutListener(this);
} else {
mapView.getViewTreeObserver()
.removeOnGlobalLayoutListener(this);
}
mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(llb,1));
}
});
};
mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(llb,15));
};