De acuerdo con las necesidades del proyecto, se deben marcar dos tipos de puntos de coordenadas en el mapa. De acuerdo con este requisito, las coordenadas de diferentes fuentes deben clasificarse y visualizarse. La siguiente imagen es la representación:
Estoy usando la última versión 4.3.1 de Baidu SDK. En primer lugar, tengo que ir a la plataforma de desarrollo de API de mapas de Baidu para registrarme e iniciar sesión. Para usar el mapa de Baidu, necesito solicitar una clave:
1. Configuración del entorno de desarrollo:
Solo necesita probar el archivo correspondiente y el paquete jar en la carpeta sdk libs descargada en su propio proyecto y agregar la dependencia de cada paquete jar;
2. Agregue algunos permisos y configuraciones clave en el archivo AndroidManifest.xml:
Agregar permisos requeridos
Agregar clave de desarrollo en la aplicación
3. Correspondiente a las jarras de las que depende el proyecto de compilación en build.gradle, y es necesario agregar las siguientes configuraciones; de lo contrario, se informará un error
sourceSets { main { jniLibs. srcDirs = [ '' libs ' ] } }
Hasta ahora, se ha completado la configuración básica de Baidu SDK. A continuación se describe cómo usarlo:
Primero, debe inicializar el SDK después de la actividad correspondiente o el método Application onCreate, también puede establecer el tipo izquierdo devuelto
. SDKInitializer la initialize (getApplicationContext ()) ; . SDKInitializer setCoordType (Partido coordtype. GCJ02 ) ; // predeterminado para coordinar BD09LL
Agregue un control de mapa en el archivo xml de diseño;
<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" / >
Inicializar en actividad
private MapView mapView; private BaiduMap baiduMap; PoiSearch mPoiSearch;
mapView = (MapView) findViewById(R.id.baidumaps);
// BaiduMap gestiona un MapView específico: rotación, movimiento, escala, eventos. . . baiduMap = la MapView .getMap () ; // establecer el nivel de zoom, el nivel predeterminado de 12 es MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory. zoomTo ( 19. ) ; baiduMap .setMapStatus (mapstatusUpdate) ; mPoiSearch . = PoiSearch la newInstance () ; mPoiSearch .setOnGetPoiSearchResultListener ( poiListener ) ;
nearbySearch ( 1 ) ;Se puede invocar después de configurar parámetros básicos
/** * 附近检索 */ 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);