我在对象上使用了新的snapshot()方法GoogleMap
,并且在我的SnapshotReadyCallback中,我将MapView
布局中的ImageView
替换为Bitmap
从回调传递给我的 an。不幸的是,即使我得到一个Bitmap
快照似乎是在地图完成渲染之前拍摄的。
我还应该补充一点,这个 View 是以编程方式创建的,并没有立即添加到 Activity 中(它实际上被放置在带有一堆其他 View 的 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
时抛出an map.moveCamera(cameraUpdate)
,抱怨 View 尚未布局,但我在内部调用它OnGlobalLayoutListener
,我认为这是在 View 全部完成渲染/布局等时获取回调的正确方法。这个例外让我不这么认为。
那么这样做的正确方法是什么?文档缺乏详细信息,视图“生命周期”也不是很清楚。当视图准备好让我调用时,我需要一个回调snapshot()