百度地圖實(shí)現(xiàn)滴滴、uber首頁(yè)marker顯示位置控制

上篇文章百度地圖獲取縮放級(jí)別主要是通過非公開api方法獲取縮放級(jí)別并配合設(shè)置中心點(diǎn)及縮放級(jí)別來控制一系列marker全部顯示在屏幕某一指定區(qū)域內(nèi),這邊文章是通過官方api組合實(shí)現(xiàn)的。

先上效果圖


效果圖

在昨天突然回憶起控制顯示范圍的主要代碼:

newLatLngBounds(LatLngBounds var0) 這個(gè)方法調(diào)用的時(shí)候

package com.baidu.mapapi.map;

import android.graphics.Point;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;

public final class MapStatusUpdateFactory {
   MapStatusUpdateFactory() {
   }

   ......

   public static MapStatusUpdate newLatLngBounds(LatLngBounds var0) {
       if(var0 == null) {
           return null;
       } else {
           MapStatusUpdate var1 = new MapStatusUpdate(3);
           var1.d = var0;
           return var1;
       }
   } 

   ......

只傳了經(jīng)緯度范圍坐標(biāo)集合,但在這里:

 MapStatus a(e var1, MapStatus var2) {
        if(null != var1 && null != var2) {
            switch(this.a) {
             ......
            case 3:
                double var3 = 0.0D;
                double var5 = 0.0D;
                double var7 = 0.0D;
                double var9 = 0.0D;
                GeoPoint var11 = CoordUtil.ll2mc(this.d.southwest);
                GeoPoint var12 = CoordUtil.ll2mc(this.d.northeast);
                var3 = var11.getLongitudeE6();
                var5 = var12.getLatitudeE6();
                var7 = var12.getLongitudeE6();
                var9 = var11.getLatitudeE6();
                float var13 = var1.a((int)var3, (int)var5, (int)var7, (int)var9, var2.a.j.right - var2.a.j.left, var2.a.j.bottom - var2.a.j.top);
                LatLng var14 = this.d.getCenter();
                return new MapStatus(var2.rotate, var14, var2.overlook, var13, var2.targetScreen, (LatLngBounds)null);
              ......
}  

case 3 返回的 MapStatus 對(duì)象的構(gòu)造參數(shù)中存在這樣一個(gè)參數(shù) var2.targetScreen,那這個(gè)參數(shù)是什么含義呢?

targetScreen
public final Point targetScreen
地圖操作中心點(diǎn)在屏幕中的坐標(biāo)

我猜想:地圖的中心點(diǎn)一般情況下是不變的,在調(diào)用newLatLngBounds(LatLngBounds var0) 方法后,最終執(zhí)行到 return new MapStatus(var2.rotate, var14, var2.overlook, var13, var2.targetScreen, (LatLngBounds)null); 這一步時(shí),var2.targetScreen 應(yīng)該就是當(dāng)前地圖的中心點(diǎn)屏幕坐標(biāo),那我可以先設(shè)置地圖中心點(diǎn)在屏幕的位置,再設(shè)置經(jīng)緯度范圍應(yīng)該能達(dá)到我想要的效果了。

實(shí)際測(cè)試中發(fā)現(xiàn),兩個(gè)界面都有地圖,都涉及到markers的顯示區(qū)域控制,但是一個(gè)可以正常顯示在屏幕上半部分,而另一個(gè)還是全屏顯示的。經(jīng)過仔細(xì)研究,發(fā)現(xiàn)能夠正??刂骑@示區(qū)域的是先設(shè)置地圖中心屏幕坐標(biāo)為屏幕上半部分中心后,再異步獲取數(shù)據(jù)設(shè)置經(jīng)緯度范圍;而設(shè)置無(wú)效的是因?yàn)槭紫仍O(shè)置地圖中心屏幕坐標(biāo)為屏幕中心,異步獲取數(shù)據(jù)后,再設(shè)置地圖中心點(diǎn)為屏幕上半部分中心,緊接著設(shè)置經(jīng)緯度范圍,中心點(diǎn)依舊是屏幕中心。
兩處唯一的區(qū)別就是時(shí)間,設(shè)置地圖中心點(diǎn)屏幕位置和設(shè)置經(jīng)緯度范圍的時(shí)間間隔。

在加大時(shí)間間隔后,問題解決。

主要代碼:

//設(shè)置地圖中心點(diǎn)
 Point point = BaiduMapUtils.getTargetScreen(mMap, displayArea);
        LatLng latLng = new LatLng(loc.getmLatitude(), loc.getmLongitude());
        MapStatus mapStatus = new MapStatus.Builder()
                .target(latLng)
                .zoom(17)
                .targetScreen(point).build();

        mMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus);

//設(shè)置經(jīng)緯度范圍
mMap.animateMapStatus(MapStatusUpdateFactory.newLatLngBounds(builder.build(), pair.first, pair.second));


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容