Mapbox源码分析(1)样式加载

简介:

通过源码,我们来一步步分析Mapbox地图引擎如何进行不同样式的数据加载的,这里是基于5.3.0的版本.

通过官网案例,我们知道在SDK中配置了不同的style样式给我们使用,通过配置不同style,便可加载不同的类型地图,那么我们便可以从setStyleUrl()这个方法着手.这里我们从MapView的setStyleUrl()方法看起

这里我们看到,他将相关配置直接往下传到底层了,从nativeMapView这个名字可以看出这是一个和原生相关的地图类,那么我们发现即使不传任何style,地图也会初始化一个默认样式的地图,那么这个默认地图是在哪配置的呢,我们使用AndroidStudio的Find Usages功能,我们看到MapboxMap这个类中的onStart()方法也使用了这个方法

我们继续Find Usages这个方法,看看在哪里调用的,我们发现在MapView的initialiseDrawingSurface()方法里初始化画布的同时,也初始化了地图

到这里,加载默认样式已经很清晰了,我们继续看nativeMapView.setStyleUrl()方法

这里我们看到这里将配置简单的往底层传,便没做什么了,这里我们全局搜索一下nativeSetStyleUrl字符串,看到和NativeMapView对应的底层原生文件native_map_view.cpp中

这里我们看到这里将setStyleUrl()方法和nativeSetStyleUrl()方法进行绑定,我们看下底层NativeMapView的setStyleUrl()方法,这里我们看到它调用了MapView的getStyle()方法,拿到Map::Impl的Style对象,然后调用Style对象的loadURL()方法

它又转给它自己的实现类的方法了,这里我们看下Style::Impl的loadURL()方法

这里我们看到它首先通知观察者样式正在加载中,然后调用fileSource.request()方法,这里我们看下参数,一个通过Resource的style方法将url分类然后封装成Resource对象,另一个则是回调函数,用于处理获取的响应数据Response

这里我们往下看,看看如果处理请求的数据的,我们看到回调函数中有这么一行代码,parse(*res.data);从名字上看,这应该是解析数据的函数,我们看下具体实现

这里我们看到通过Parser.parse()方法将解析的json字符串进行解析,然后进行一些数据的配置,包括数据源,图层,精灵,字体,默认缩放等级和经纬度,方向等等,最后调用onStyleLoaded()方法通知观察者样式加载结束.

你可能感兴趣的:(Mapbox源码分析(1)样式加载)