プロジェクトのニーズに応じて、2種類の座標点をマップ上にマークする必要があります。この要件に従って、さまざまなソースの座標を分類して表示する必要があります。次の図はレンダリングです。
Baidu SDKの最新バージョン4.3.1を使用しています。まず、BaiduマップAPI開発プラットフォームにアクセスして、登録とログインを行う必要があります。Baiduマップを使用するには、キーを申請する必要があります。
1.開発環境の構成:
ダウンロードしたsdk libsフォルダー内の対応するsoファイルとjarパッケージを独自のプロジェクトにテストし、各jarパッケージの依存関係を追加するだけです。
2. AndroidManifest.xmlファイルにいくつかの権限とキー設定を追加します。
必要な権限を追加する
アプリケーションに開発キーを追加する
3. build.gradleでビルドプロジェクトが依存するjarに対応し、次の設定を追加する必要があります。追加しない場合、エラーが報告されます
sourceSets { main { jniLibs。srcDirs = [ 'libs' ] } }
以上でBaidu SDKの基本設定は完了ですので、以下にその使い方を説明します。
まず、対応するアクティビティまたはアプリケーションのonCreateメソッドの後にSDKを初期化する必要があります。また、返される左側のタイプを設定することもできます。
。SDKInitializer 初期化(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" / >
アクティビティで初期化
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);