【问题标题】:receiving ambiguous sky screen while loading google map加载谷歌地图时收到模糊的天空屏幕
【发布时间】:2017-02-26 11:09:54
【问题描述】:

在设备上加载谷歌地图时,我有时会在屏幕下方收到。它会在第二次加载时出现,如下所示。 否则它与普通的谷歌地图一样完美,我正在使用 SupportmapFragment 并获取 googleMap 对象。

 supportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_view_fragment);

以下是在活动/片段中显示地图的代码

public static void drawRouteIntoMap(final List<? extends MapHelper> position, final GoogleMap googleMap) {
        /*List<MapHelper> position = new ArrayList<MapHelper>();
        for (int i = lastPosition; i < maps.size(); i++) {
            position.add(maps.get(i));
        }*/
        final LatLngBounds.Builder mapBounds = new LatLngBounds.Builder();
        if (position.size() > 0 && Validator.isNotNull(googleMap)) {
            googleMap.clear();
            List<PolylineOptions> polylineOptionses = new ArrayList<PolylineOptions>();
            PolylineOptions option = null;
            Boolean lastPause = null;
            for (MapHelper map : position) {
                if (map.isPause()) {
                    if (Validator.isNull(lastPause) || !lastPause) {
                        option = new PolylineOptions().width(5).color(Color.rgb(255, 0, 155)).geodesic(true);
                        polylineOptionses.add(option);
                    }
                    mapBounds.include(new LatLng(map.getLatitude(),map.getLongitude()));
                    option.add(new LatLng(map.getLatitude(), map.getLongitude()));
                } else {
                    if (Validator.isNull(lastPause) || lastPause) {
                        option = new PolylineOptions().width(5).color(Color.rgb(0, 179, 253)).geodesic(true);
                        polylineOptionses.add(option);
                    }
                    mapBounds.include(new LatLng(map.getLatitude(),map.getLongitude()));
                    option.add(new LatLng(map.getLatitude(), map.getLongitude()));
                }
                lastPause = map.isPause();
            }
            for (PolylineOptions options : polylineOptionses) {
                googleMap.addPolyline(options);
            }
            if(Validator.isNotNull(option)){
                //List<LatLng> points = option.getPoints();


                googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
                    @Override
                    public void onMapLoaded() {
                        LatLng startPoint = new LatLng(position.get(0).getLatitude(), position.get(0).getLongitude());
                        googleMap.addMarker(new MarkerOptions().position(startPoint).title("start").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
                        mapBounds.include(startPoint);
                        LatLng endPoint = new LatLng(position.get(position.size() - 1).getLatitude(), position.get(position.size() - 1).getLongitude());
                        mapBounds.include(endPoint);
                        googleMap.addMarker(new MarkerOptions().position(endPoint).title("finish").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                        googleMap.setPadding(15, 205, 10, 110);
                        googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(mapBounds.build(), 0));
                        //googleMap.animateCamera(CameraUpdateFactory.newLatLngBounds(mapBounds.build(), 10));
                        googleMap.moveCamera(CameraUpdateFactory.zoomOut());

                    }
                });
            }

        }
    }


 supportMapFragment.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap googleMap) {
                if (Validator.isNotNull(googleMap)) {
                    googleMap.setMyLocationEnabled(false);
                    googleMap.clear();
                    googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                        @Override
                        public void onMapClick(LatLng latLng) {
                            if (activity.preferences.isSaveScreen()) {
                                facebook.setChecked(false);
                                twitter.setChecked(false);
                                activity.replaceFragment(new FullMapFragment(), null);
                            }
                            if (!activity.preferences.isSaveScreen()) {
                                activity.preferences.setHistoryScreen(true);
                                activity.replaceFragment(new FullMapFragment(), null);
                            }
                        }
                    });
                    if (gps) {
                        nonGpsSummary.setVisibility(View.GONE);
                        List<HistoryMap> historyMaps = new ArrayList<HistoryMap>();
                        if (Validator.isNotNull(activity.preferences.getUserHistory().getHistoryMaps())) {
                            historyMaps.addAll(Arrays.asList(activity.preferences.getUserHistory().getHistoryMaps()));
                        }
                        if (historyMaps.size() > 0) {
                            if (Validator.isNotNull(googleMap)) {
                              drawRouteIntoMap(historyMaps, googleMap);
                            }
                        } else {
                            mapFrame.setVisibility(View.GONE);
                        }
                    } else {
                        gpsSummary.setVisibility(View.GONE);
                    }
                }
            }
        });

这个问题与zoom over specific route google map 有关。 通过使用它,我可以通过 mapbounds 获得正确的路线,但我不明白为什么显示此屏幕。

我没有收到坐标 0.0 我调试那个,api 键也是正确的。

【问题讨论】:

  • 你从哪里打电话给drawRouteIntoMap?你为什么要在那里设置GoogleMap.OnMapLoadedCallback
  • @antonio 地图完全加载后我在那里显示路线。
  • 但是地图可以在你设置GoogleMap.OnMapLoadedCallback之前完全加载,然后就没有效果了。您是否尝试过在 if(Validator.isNotNull(option)){ 内的 onMapLoaded 方法中做的事情
  • @antonio 让我试试
  • @antonio 我试过还是一样的问题。

标签: android google-maps google-maps-markers google-maps-android-api-2


【解决方案1】:

您呼叫moveCamera 两次。第一个尝试移动相机,但第二个不等待第一个结束并执行缩小。

这可能不会一直发生,并且可能在不同的设备上表现不同。

最好的选择是在 CameraUpdateFactory.newLatLngBounds(mapBounds.build(), 0) 上设置一个填充而不是 0

【讨论】:

    【解决方案2】:

    当您的坐标设置不正确时会出现此问题。确保您使用的坐标指向土地以正确获取地图。另一个可能的原因是您的 API 密钥不起作用,请尝试为此项目生成新的 API 密钥。

    有关详细信息,请查看这些相关的 SO 问题。

    【讨论】:

    • 当我加载具有相同坐标的同一张地图时,它只会发生第二次
    • 我怎样才能正确地防止这种情况和位置图,尽管坐标是正确的并且它不是 0.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2018-06-21
    相关资源
    最近更新 更多