根据项目需求,要在地图上标记两种坐标点,根据这个需求需要对不同来源的坐标分类显示。下图是效果图:
我使用的是最新的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文件中添加地图控件;
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;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);