我发现 map.snapshot() 方法只有在特殊情况下才能正常工作。如果调用太早,它会崩溃,如果调用太晚和设置相机后不久,它将返回错误地图图像的快照。我希望快照返回由最后给定的相机位置和折线定义的地图快照。然而,很难让 GoogleMap 类等待它是否获取了正确的图块。如果用户单击按钮进行快照很容易,因为用户知道地图何时准备就绪,如果以编程方式发生则更困难。
如果您有 CameraPosition (LatLng, zoom),那么如果 MapFragment 是使用 GoogleMapOption 创建的,则效果很好:
GoogleMapOptions googleMapOptions = new GoogleMapOptions();
googleMapOptions.liteMode(true).mapType(GoogleMap.MAP_TYPE_NORMAL); // if this is what you want
googleMapOptions.camera(new CameraPosition(new LatLng(56, 10), 11, 0, 0));
MapFragment.newInstance(googleMapOptions);
如果你还没有CameraPosition,那就更难了。如果计算相机位置以便给定标记包含在相机中,您可能还没有相机位置,因为该计算需要使用宽度/高度初始化 GoogleMap。 (鸡和蛋的问题,或者自己动手)。
子类 MapFragment 并覆盖 onCreate
public class FixedMapFragment extends MapFragment {
public void setOncreateListener(Listener listener) {
this.listener = listener;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = super.onCreateView(inflater, container, savedInstanceState);
if (listener != null) {
listener.onCreate(v, mMapManager);
}
return v;
}
}
然后创建您的片段,并设置您的 onCreateListener。 onCreateListener 应该更新 cameraPosition 并设置折线等。
当 GoogleMap 上的 onLoad 被调用时,我们应该安排另一个 onLoad 来执行快照(否则我们会再次得到错误的图块)。
private void onLoad() {
// Set camera position and polylines here
mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
snapshot(mSnapshotCallback);
}
});
}
缺点:有时地图会在屏幕上闪烁“不正确”的世界地图。为了避免这种情况,我们可以隐藏地图视图,直到使用
拍摄快照
mapView.setVisibility(VIEW.INVISIBLE);
这已在 google-maps 8.3.0 for android 上进行了测试。