簡介:
通過源碼檬嘀,我們來一步步分析Mapbox地圖引擎如何進(jìn)行不同樣式的數(shù)據(jù)加載的槽驶,這里是基于5.3.0的版本.
通過官網(wǎng)案例,我們知道在SDK中配置了不同的style樣式給我們使用鸳兽,通過配置不同style,便可加載不同的類型地圖掂铐,那么我們便可以從setStyleUrl()這個(gè)方法著手.這里我們從MapView的setStyleUrl()方法看起
這里我們看到,他將相關(guān)配置直接往下傳到底層了,從nativeMapView這個(gè)名字可以看出這是一個(gè)和原生相關(guān)的地圖類堡纬,那么我們發(fā)現(xiàn)即使不傳任何style,地圖也會初始化一個(gè)默認(rèn)樣式的地圖,那么這個(gè)默認(rèn)地圖是在哪配置的呢蒿秦,我們使用AndroidStudio的Find Usages功能烤镐,我們看到MapboxMap這個(gè)類中的onStart()方法也使用了這個(gè)方法
我們繼續(xù)Find Usages這個(gè)方法,看看在哪里調(diào)用的棍鳖,我們發(fā)現(xiàn)在MapView的initialiseDrawingSurface()方法里初始化畫布的同時(shí)炮叶,也初始化了地圖
到這里,加載默認(rèn)樣式已經(jīng)很清晰了渡处,我們繼續(xù)看nativeMapView.setStyleUrl()方法
這里我們看到這里將配置簡單的往底層傳镜悉,便沒做什么了,這里我們?nèi)炙阉饕幌耼ativeSetStyleUrl字符串医瘫,看到和NativeMapView對應(yīng)的底層原生文件native_map_view.cpp中
這里我們看到這里將setStyleUrl()方法和nativeSetStyleUrl()方法進(jìn)行綁定侣肄,我們看下底層NativeMapView的setStyleUrl()方法,這里我們看到它調(diào)用了MapView的getStyle()方法醇份,拿到Map::Impl的Style對象稼锅,然后調(diào)用Style對象的loadURL()方法
它又轉(zhuǎn)給它自己的實(shí)現(xiàn)類的方法了,這里我們看下Style::Impl的loadURL()方法
這里我們看到它首先通知觀察者樣式正在加載中僚纷,然后調(diào)用fileSource.request()方法矩距,這里我們看下參數(shù),一個(gè)通過Resource的style方法將url分類然后封裝成Resource對象怖竭,另一個(gè)則是回調(diào)函數(shù)锥债,用于處理獲取的響應(yīng)數(shù)據(jù)Response
這里我們往下看,看看如果處理請求的數(shù)據(jù)的痊臭,我們看到回調(diào)函數(shù)中有這么一行代碼哮肚,parse(*res.data);從名字上看,這應(yīng)該是解析數(shù)據(jù)的函數(shù)广匙,我們看下具體實(shí)現(xiàn)
這里我們看到通過Parser.parse()方法將解析的json字符串進(jìn)行解析绽左,然后進(jìn)行一些數(shù)據(jù)的配置,包括數(shù)據(jù)源艇潭,圖層拼窥,精靈,字體蹋凝,默認(rèn)縮放等級和經(jīng)緯度鲁纠,方向等等,最后調(diào)用onStyleLoaded()方法通知觀察者樣式加載結(jié)束.