MapView v2 snapshot()创建一个未完成的Bitmap

时间:2013-09-25 21:29:38

标签: android android-mapview android-maps-v2

我在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()

时的回调

0 个答案:

没有答案