我在GoogleMap
对象上使用了新的snapshot()方法,而在我的SnapshotReadyCallback中,我正在我的布局中换取MapView
ImageView
1}} Bitmap
从回调传递给我。不幸的是,即使我得到一个Bitmap
,看起来快照是在地图完成渲染之前拍摄的。
我还应该补充说,这个View是以编程方式创建的,并且不会立即添加到Activity中(它实际上放在带有一堆其他视图的ScrollView中)。
我的代码的主旨(为了简洁起见)是:
public class MyCustomView extends LinearLayout {
private FrameLayout mapContainer;
@Override public void onAttachedToWindow() {
super.onAttachedToWindow();
// Setup GoogleMapOptions ...
mapView = new MapView(getContext(), googleMapOptions);
mapContainer.addView(mapView);
mapView.onCreate(null);
mapView.onResume();
// Setup CameraUpdate ...
mapView.getViewTreeObserver().addOnGlobalLayoutListener(new MapLayoutListener(mapView, cameraUpdate));
}
private class MapLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
private final WeakReference<MapView> mapViewReference;
private final CameraUpdate cameraUpdate;
public MapLayoutListener(MapView mapView, CameraUpdate cameraUpdate) {
mapViewReference = new WeakReference<MapView>(mapView);
this.cameraUpdate = cameraUpdate
}
@Override public void onGlobalLayout() {
MapView mapView = mapViewReference.get();
if (mapView == null) {
return;
}
mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
GoogleMap map = mapView.getMap();
if (map == null) {
return;
}
try {
map.moveCamera(cameraUpdate);
} catch (IllegalStateException e) {
e.printStackTrace();
}
map.snapshot(new GoogleMap.SnapshotReadyCallback() {
@Override public void onSnapshotReady(Bitmap bitmap) {
MapView mapView = mapViewReference.get();
if (mapView == null) {
return;
}
mapContainer.removeAllViews();
ImageView imageView = new ImageView(getContext());
imageView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
imageView.setImageBitmap(bitmap);
mapContainer.addView(imageView);
}
});
}
}
}
有时在调用IllegalStateException
时抛出map.moveCamera(cameraUpdate)
,抱怨View尚未布局,但我在OnGlobalLayoutListener
内调用它,我认为是{当你的View完成渲染/布局等时,获得回调的正确方法。这个例外让我想到了。
那么这样做的正确方法是什么?文档很少详细,而视图“生命周期”也不是很清楚。我需要的是当View准备好调用snapshot()