地圖上添加view和覆蓋物。javascript
地圖Logo不容許遮擋,可經過mBaiduMap.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);方法能夠設置地圖邊界區域,來避免UI遮擋。
其中參數paddingLeft、paddingTop、paddingRight、paddingBottom參數表示距離屏幕邊框的左、上、右、下邊距的距離,單位爲屏幕座標的像素密度。java----------------->利用這個來添加自定義的內容ide
- 標註覆蓋物
- 幾何圖形覆蓋物
- 文字覆蓋物
- 彈出窗覆蓋物
地圖上添加View
因爲地圖的Logo不容許被遮擋,百度天然會想辦法針對一些開發者場景做出本身的調整,好比上面所說的setPadding()或者setViewPadding()同樣好使,具體的使用分爲兩步:
第一步,ui
mBaiduMap.setPadding(0, 0, 0, 200);複製代碼
第二步,this
private void addView() {
TextView textView = new TextView(this);
textView.setText("這是用戶自定義的View,這個時候logo和底部的一些內容會向上移動,由於MapView設置了底部Padding");
textView.setBackgroundResource(R.color.colorPrimary); //建立一個TextView而後往底部放置,官方Demo如是操做
MapViewLayoutParams.Builder builder = new MapViewLayoutParams.Builder();
builder.layoutMode(MapViewLayoutParams.ELayoutMode.absoluteMode);
builder.width(bmapView.getWidth());
builder.height(200);
builder.point(new Point(0, bmapView.getHeight()));
builder.align(MapViewLayoutParams.ALIGN_LEFT, MapViewLayoutParams.ALIGN_BOTTOM);
bmapView.addView(textView, builder.build());
}複製代碼
這樣子就在底部添加了一個TextView,固然想添加其餘的View天然也是可行的,具體效果圖往下看。編碼
地理編碼,標註覆蓋物和彈出窗覆蓋物
利用標註覆蓋物在地圖上的特定位置添加標註,而後給標註覆蓋物設置點擊監聽展現彈出覆蓋物spa
//這個是「打點」按鈕的點擊事件,點擊事件發生後,地理編碼對象執行Address->location的解析,解析結果返回以後,拿到對應的點的經緯度,也就是LatLng實例和對應的地址信息,而後執行addMarker操做
private void addPointByEditText() {
String placename = etPoint.getText().toString();
final GeoCoder geo = GeoCoder.newInstance();
geo.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult.getLocation() != null) {
addMarker(geoCodeResult.getLocation() , geoCodeResult.getAddress());
//addText(geoCodeResult.getLocation(), "看過來 :" + geoCodeResult.getAddress());//這個是後面添加文字覆蓋物的時候使用到的
} else {
Toast.makeText(MainActivity.this, " No Result of GeoCoder! Sorry", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
}
});
geo.geocode(new GeoCodeOption().address(placename).city(placename));
}
......
//添加標註物
private void addMarker(LatLng point, String address) {
//定義Maker座標點
//LatLng point = new LatLng(39.963175, 116.400244);
//構建MarkerOption,用於在地圖上添加Marker
Bundle bundle = new Bundle();
bundle.putParcelable("LATLNG", point);//傳遞Bundle對象,方便後面讀取對應的info來建立pop window
bundle.putString("ADDRESS", address);
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap).extraInfo(bundle);
//在地圖上添加Marker,並顯示
mBaiduMap.addOverlay(option);
}
//設置標註覆蓋物的點擊事件監聽
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//這裏是MarkerOption建立的時候傳入的點座標和對應的地址信息
if (marker.getExtraInfo() != null) {
LatLng point = marker.getExtraInfo().getParcelable("LATLNG");
String address = marker.getExtraInfo().getString("ADDRESS");
addPop(point, address);
}
return false;
}
});
......
//添加彈出窗覆蓋物
private void addPop(LatLng point, String message) {
//建立InfoWindow展現的view
Button button = new Button(getApplicationContext());
button.setBackgroundResource(R.drawable.marker_info_bg);
button.setTextColor(Color.WHITE);
button.setText(message);
//建立InfoWindow , 傳入 view, 地理座標, y 軸偏移量
InfoWindow mInfoWindow = new InfoWindow(button, point, -47);
//顯示InfoWindow
mBaiduMap.showInfoWindow(mInfoWindow);
}複製代碼
實際效果圖:
3d
文字覆蓋物
文字覆蓋物主要就是在地圖上添加一些字串, 用上面的代碼,將標註覆蓋物改爲文字覆蓋物code
//設置文字覆蓋物
private void addText(LatLng point, String message) {
//構建文字Option對象,用於在地圖上添加文字
OverlayOptions textOption = new TextOptions()
.bgColor(0xAAFFFF00)
.fontSize(35)
.fontColor(0xFFFF00FF)
.text(message)
.rotate(-30)
.position(point);
//在地圖上添加該文字對象並顯示
mBaiduMap.addOverlay(textOption);
}複製代碼
實際效果圖:
cdn
行政區邊界搜索和多邊形覆蓋物
利用DistrictSearch和PolyOverlay,實現圈出行政區域的效果
mDistrictSearch = DistrictSearch.newInstance();//建立行政區域查詢的實例
......
//添加多邊形區域
private void addPoly(String cityname) {
//創建搜索條件
DistrictSearchOption option = new DistrictSearchOption().cityName(cityname).districtName(cityname);
//設置搜索監聽事件
mDistrictSearch.setOnDistrictSearchListener(new OnGetDistricSearchResultListener() {
@Override
public void onGetDistrictResult(DistrictResult districtResult) {
if (districtResult.error == SearchResult.ERRORNO.NO_ERROR) {
List<List<LatLng>> pointsList = districtResult.getPolylines();
if (pointsList == null) return;
//地理邊界對象
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (List<LatLng> polyline : pointsList) {
OverlayOptions ooPolyline11 = new PolylineOptions().width(10)
.points(polyline).dottedLine(true).color(Color.RED);
mBaiduMap.addOverlay(ooPolyline11);//添加OverLay
OverlayOptions ooPolygon = new PolygonOptions().points(polyline)
.stroke(new Stroke(5, 0xAA00FF88)).fillColor(0xAAFFFF00);
mBaiduMap.addOverlay(ooPolygon);//添加OverLay
for (LatLng latLng : polyline) {
builder.include(latLng);//包含這些點
}
}
}
}
});
mDistrictSearch.searchDistrict(option);//執行行政區域的搜索
}複製代碼
實際效果圖:
具體SDK集成請參考官網