2

我在对象上使用了新的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()

4

0 回答 0