上篇文章百度地圖獲取縮放級別主要是通過非公開api方法獲取縮放級別并配合設(shè)置中心點及縮放級別來控制一系列marker全部顯示在屏幕某一指定區(qū)域內(nèi)耸成,這邊文章是通過官方api組合實現(xiàn)的。
先上效果圖
在昨天突然回憶起控制顯示范圍的主要代碼:
newLatLngBounds(LatLngBounds var0)
這個方法調(diào)用的時候
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
對象的構(gòu)造參數(shù)中存在這樣一個參數(shù) var2.targetScreen
,那這個參數(shù)是什么含義呢井氢?
targetScreen
public final Point targetScreen
地圖操作中心點在屏幕中的坐標(biāo)
我猜想:地圖的中心點一般情況下是不變的,在調(diào)用newLatLngBounds(LatLngBounds var0)
方法后岳链,最終執(zhí)行到 return new MapStatus(var2.rotate, var14, var2.overlook, var13, var2.targetScreen, (LatLngBounds)null);
這一步時花竞,var2.targetScreen
應(yīng)該就是當(dāng)前地圖的中心點屏幕坐標(biāo),那我可以先設(shè)置地圖中心點在屏幕的位置,再設(shè)置經(jīng)緯度范圍應(yīng)該能達到我想要的效果了掸哑。
實際測試中發(fā)現(xiàn)约急,兩個界面都有地圖,都涉及到markers的顯示區(qū)域控制厌蔽,但是一個可以正常顯示在屏幕上半部分,而另一個還是全屏顯示的摔癣。經(jīng)過仔細研究奴饮,發(fā)現(xiàn)能夠正常控制顯示區(qū)域的是先設(shè)置地圖中心屏幕坐標(biāo)為屏幕上半部分中心后择浊,再異步獲取數(shù)據(jù)設(shè)置經(jīng)緯度范圍戴卜;而設(shè)置無效的是因為首先設(shè)置地圖中心屏幕坐標(biāo)為屏幕中心琢岩,異步獲取數(shù)據(jù)后叉瘩,再設(shè)置地圖中心點為屏幕上半部分中心,緊接著設(shè)置經(jīng)緯度范圍粘捎,中心點依舊是屏幕中心。
兩處唯一的區(qū)別就是時間危彩,設(shè)置地圖中心點屏幕位置和設(shè)置經(jīng)緯度范圍的時間間隔攒磨。
在加大時間間隔后,問題解決汤徽。
主要代碼:
//設(shè)置地圖中心點
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));