上篇文章百度地圖獲取縮放級(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));