根據項目需求,要在地圖上標記兩種座標點,根據這個需求需要對不同來源的座標分類顯示。下圖是效果圖:
我使用的是最新的4.3.1版本的百度sdk,首先需要去百度地圖api開發平臺註冊登陸,要想使用百度地圖還要申請key:
1.開發環境配置:
只需要將下載的sdk libs文件夾中相應的so文件和jar包考到自己的項目中並添加每個jar包的依賴;
2.在AndroidManifest.xml文件中要添加一些權限和 key的設置:
添加所需權限
在application中添加開發密鑰
3. 對應在build.gradle生成工程所依賴的jar,並需要添加如下設置,否則會報錯
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
至此百度sdk的基本配置已經完成了 下面介紹如何使用:
首先需要在對應的activity 或者 Application 的 onCreate方法之後初始化sdk,還可以設置返回的左邊類型
SDKInitializer.initialize(getApplicationContext()); SDKInitializer.setCoordType(CoordType.GCJ02);//默認爲BD09LL座標
佈局xml文件中添加地圖控件;
<com.baidu.mapapi.map.MapView android:id="@+id/baidumaps" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:clickable="true" />
在activity中初始化
private MapView mapView; private BaiduMap baiduMap; PoiSearch mPoiSearch;
mapView = (MapView) findViewById(R.id.baidumaps);
//BaiduMap管理具體的某一個MapView: 旋轉,移動,縮放,事件。。。 baiduMap = mapView.getMap(); //設置縮放級別,默認級別爲12 MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19); baiduMap.setMapStatus(mapstatusUpdate); mPoiSearch = PoiSearch.newInstance(); mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
nearbySearch(1);設置一下基本參數之後就可以調用
/** * 附近檢索 */ private void nearbySearch(int page) { PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); //120.220854,30.259387 nearbySearchOption.location(new LatLng(latitude,longitude)); nearbySearchOption.keyword("超市");//小吃快餐 nearbySearchOption.radius(10000);// 檢索半徑,單位是米 nearbySearchOption.pageNum(page); nearbySearchOption.pageCapacity(500); mPoiSearch.searchNearby(nearbySearchOption);// 發起附近檢索請求 }
還要對mPoiSearch設置監聽方法:
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){ public void onGetPoiResult(PoiResult result){ if (result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(ShopMapActivity.this, "沒有搜索到結果...", Toast.LENGTH_LONG).show(); } else { baiduMap.clear(); // 得到具體地址的座標 // 此處是設置藍色標記的方法 for(int i=0;i<result.getAllPoi().size();i++) { PoiInfo pos = result.getAllPoi().get(i); LatLng lat = pos.location; // 得到一個標記的控制器 MarkerOptions mMarkerOptions = new MarkerOptions(); // 我們設置標記的時候需要傳入的參數 BitmapDescriptor mbitmapDescriptor = BitmapDescriptorFactory .fromResource(R.mipmap.location_blue); // 設置標記的圖標 mMarkerOptions.icon(mbitmapDescriptor); // 設置標記的座標 mMarkerOptions.position(lat); mMarkerOptions.title(pos.name); // 添加標記 baiduMap.addOverlay(mMarkerOptions); // 設置地圖跳轉的參數 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory .newLatLngZoom(lat, 15); // 設置進行地圖跳轉 baiduMap.setMapStatus(mMapStatusUpdate); }
紅色標記點的設置 這裏的list是一些模擬數據
for(int i=0;i<list.size();i++) { PoiInfo pos = result.getAllPoi().get(i); LatLng lat = list.get(i); // 得到一個標記的控制器 MarkerOptions mMarkerOptions = new MarkerOptions(); // 我們設置標記的時候需要傳入的參數 BitmapDescriptor mbitmapDescriptor = BitmapDescriptorFactory .fromResource(R.mipmap.location_red); // 設置標記的圖標 mMarkerOptions.icon(mbitmapDescriptor); // 設置標記的座標 mMarkerOptions.position(lat); mMarkerOptions.title(pos.name); // 添加標記 baiduMap.addOverlay(mMarkerOptions); // 設置地圖跳轉的參數 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory .newLatLngZoom(lat, 15); // 設置進行地圖跳轉 baiduMap.setMapStatus(mMapStatusUpdate); }
baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { baiduMap.hideInfoWindow(); } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } }); baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { showLocation(marker);//點擊marker顯示詳細信息 // return true; } }); } progressDialog.dismiss(); } public void onGetPoiDetailResult(PoiDetailResult result){ //獲取Place詳情頁檢索結果 progressDialog.dismiss(); } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { progressDialog.dismiss(); } };
private void showLocation(final Marker marker) { //顯示氣泡 // 創建InfoWindow展示的view LatLng pt = null; double latitude, longitude; latitude = marker.getPosition().latitude; longitude = marker.getPosition().longitude; InfoWindow infoWindow; TextView tv = new TextView(ShopMapActivity.this); tv.setBackgroundResource(R.drawable.change_btn_bg_gray); tv.setPadding(30, 20, 30, 20);// 大小 tv.setText( marker.getTitle()); tv.setTextColor(Color.parseColor("#000000")); final LatLng latLng = marker.getPosition(); Point p = baiduMap.getProjection().toScreenLocation(latLng); p.y -= 47; LatLng ll = baiduMap.getProjection().fromScreenLocation(p); mInfoWindow = new InfoWindow(tv, ll, 1); baiduMap.showInfoWindow(mInfoWindow); //顯示氣泡 }
protected void initData(Bundle savedInstanceState) { list.add(new LatLng(31.172713399983827,121.48811344710886)); list.add(new LatLng(31.179060850684824,121.50363668006136)); list.add(new LatLng(31.17131410477326,121.49315948551842)); list.add(new LatLng(31.176633393276752,121.48780798968677)); list.add(new LatLng(31.178353120267477,121.47352839282098)); }
最終實現的效果:
如果有ui刷新的操作 對空件的requestFocus請求將會失效 需要做個延遲操作
goodsSearch.postDelayed(new Runnable() {
public void run() {
etAddGoods.requestFocus();
}
},500);