Android Google Maps v2:初始加载时相机超出范围。在恢复应用程序时,相机处于焦点

时间:2014-11-20 15:18:47

标签: android android-maps-v2

我一直在尝试构建一个使用包含纬度和经度的json数据的应用,创建多个标记并将它们固定到地图上。

一切顺利,除了这种奇怪的行为 - 在初始加载时,地图相机超出范围。

On Intial loading

如果应用程序进入后台,并且在恢复时,相机焦点现在正确。

On Resuming the app

这是我用来创建标记以及定义边界的代码。

private void setUpMapIfNeeded(ArrayList<MarkerObject> mapMarkers2) {

    if(mMap == null) {

        mMapFragment = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map));
        mMap = mMapFragment.getMap();
        if(mMap != null) {

            /*setUpMap(mapMarkers);
            Log.i(TAG,"SetUpMap is called");*/

            for(int i=0; i<mapMarkers2.size(); i++) {

                customMarker = mMap.addMarker(new MarkerOptions()
                .position(new LatLng(mapMarkers.get(i).getLatitude(), mapMarkers.get(i).getLongitude()))
                .title(mapMarkers.get(i).getName())
                .snippet(mapMarkers.get(i).getContact()));

            }

            //Required for focusing the camera

            final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
            if(mapView.getViewTreeObserver().isAlive()) {

                mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

                    @Override
                    public void onGlobalLayout() {

                        /*LatLngBounds bounds = new LatLngBounds.Builder()
                                                              .include(markerLatLng).build();*/

                        LatLngBounds.Builder bld = new LatLngBounds.Builder();
                        for(int i=0; i<mapMarkers.size(); i++) {

                            LatLng ll = new LatLng(mapMarkers.get(i).getLatitude(), mapMarkers.get(i).getLongitude());

                            bld.include(ll);
                        }

                        LatLngBounds bounds = bld.build();

                        /*if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {

                            mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        }else {

                            mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        }
                        */
                        mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,10));
                        //mMap.animateCamera(CameraUpdateFactory.zoomIn());
                        mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                        Log.i(TAG,"Camera position: "+ mMap.getCameraPosition());

                    }
                });
            }
        }
    }
}

为什么会出现这种奇怪的行为?

3 个答案:

答案 0 :(得分:0)

尝试在onMapLoaded侦听器中调用moveCamera

mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
    @Override
    public void onMapLoaded() {
        // moveCamera here
    }
});

答案 1 :(得分:0)

删除全局树观察者,添加标记,使用所有点创建LatLng []并使用下面的代码缩放到地图上的所有点。我为增加一个漂亮的填充添加了一点奖励。 (如果愿意,也可以在onResume上调用此方法)

        public void zoomToPoints(LatLng... geoPoint){
        LatLngBounds.Builder b = new LatLngBounds.Builder();
        for (LatLng m : geoPoint)
        {
            if (m != null)
                b.include(m);
        }
        LatLngBounds bounds = b.build();
        int padding = (int) (Math.min(DEVICE_WIDTH, DEVICE_HEIGHT) * 0.1);
        CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
        mMap.animateCamera(cu);
}

我还建议添加一个处理程序来延迟map init以避免主线程错开,特别是如果你使用了很多引脚。在OnCreate中构建地图并延迟绘制引脚。

        new Handler().postDelayed(new Runnable()
        {
         @Override
         public void run()
         {
            drawPinsAndZoom();
         }
    }, 500);

答案 2 :(得分:0)

在内部尝试Catch移动animateCamera和Cameraupdatefactory解决了这个问题。这是代码

          try{
                mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(llb,15));

            }catch (IllegalStateException e) {

                e.printStackTrace();

                final View mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();
                Log.i(TAG,"MapView is obtained ");

                if(mapView.getViewTreeObserver().isAlive()) {

                    mapView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

                                @Override
                                public void onGlobalLayout() {

                                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                                    mapView.getViewTreeObserver()
                                    .removeGlobalOnLayoutListener(this);
                                    } else {
                                        mapView.getViewTreeObserver()
                                        .removeOnGlobalLayoutListener(this);
                                    }

                                    mMap.moveCamera(CameraUpdateFactory.newLatLngBounds(llb,1));
                                }
                    });

                };

                mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(llb,15));

           };