Android百度地图黑线、无法拖动、个性化地图的坑

    1.黑线问题

    例如锁屏返回黑线,页面回退黑线,dialog黑线。这些问题90%出在没有在合适位置调用百度地图的生命周期所造成的。所谓的合适位置并不是一定像官方文档里或者demo里写的那样,在Activity/Fragment的生命周期里写上百度地图相应的生命周期,而是要根据项目情况不同区分处理。

    举个例子,我们在一个全屏的MapView里打开了一个半透明/非全屏的Activity2如下图所示

    这个时候,Mapview所在的Activity1会执行onPause。在结束掉Activity2的时候,Activity1会执行OnResume。这种情况下在相应的生命周期里写上百度地图的生命周期函数是没有问题的。

    然而,我们在这个页面再打开一个全屏的Activity3,当我们关闭Activity3回到这个页面的时候,黑线出现了。原因就是这个操作会分别执行一次Activity2的onPause/onResume,而Activity1的生命周期并没有执行到!

    所以,百度地图的生命周期函数使用更准确的说法应该是,在百度地图不可见的时候调用mapView.onPause,在百度地图可见的时候调mapView.onResume,也就是说在Activity2的生命周期里通知Activity1里的百度地图执行相应的生命周期函数就可以了。


    2.锁屏解锁/回退后地图无法拖动的问题

    确保在正确调用百度地图周期,升级你的SDK版本至4.5.2,并使用MapView构造地图。4.5.2以后MapView可以完全取代TextureMapview,并且优化了fragment切换地图的闪黑屏现象和部分设备无法拖动地图的现象!


    3.个性化百度地图无效的问题

    自定义皮肤的正确使用姿势如下 (测试通过的SDK版本4.3.1-4.5.2)

    注意Assets里的customStyle就是你的自定义皮肤json,不能有后缀,里面直接写json。这个方法必须放在setContentView以及SDKInitializer.initializ()之前执行!

SDKInitializer.initialize(getContext().getApplicationContext());
之前执行!
/**
     * 设置个性化地图config文件路径
     */
    private void setMapCustomFile(Context context, String PATH) {
        FileOutputStream out = null;
        InputStream inputStream = null;
        String moduleName;
        try {
            inputStream = context.getAssets()
                    .open("customStyle/" + PATH);
            byte[] b = new byte[inputStream.available()];
            inputStream.read(b);

            moduleName = context.getFilesDir().getAbsolutePath();
            File f = new File(moduleName + "/" + "map_style.txt");
            if (f.exists()) {
                f.delete();
            }
            f.createNewFile();
            out = new FileOutputStream(f);
            out.write(b);
            MapView.setCustomMapStylePath(moduleName + "/" + "map_style.txt");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    然后再地图加载完成的回调中

 //地图加载完成回调,(只在初始化调一次)
        bdMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {
                MapView.setMapCustomEnable(true);
            
                }
            }
        });

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章