Android 百度地圖 SDK v3_3_0 (四),androidv3_3_0
轉載請標明出處:http://blog.csdn.net/tanzuai/article/details/43833125
本篇部落格要實現的功能
先上:
上面就是我們最終要實現的效果
1.首先我們來介紹下要實現的功能:
A.更改座標的位置
B.更改座標的表徵圖
C.刪除表徵圖
D.座標每隔一段時間變動一次
clear.覆蓋物的清楚
2.下面我們通過執行個體,一一的解析上面的功能
2.1首先我們初始化要用到的變數
/** * MapView 是地圖主控制項 */private MapView mMapView;/** * 百度地圖 */private BaiduMap mBaiduMap;/** * Marker表示為標記 */private Marker mMarkerA;private Marker mMarkerB;private Marker mMarkerC;private Marker mMarkerD;//private Marker mMarkerE;/** * 資訊窗 */private InfoWindow mInfoWindow;/** * 初始化全域 bitmap 資訊,不用時及時 recycle */private BitmapDescriptor bdA;private BitmapDescriptor bdB;private BitmapDescriptor bdC;private BitmapDescriptor bdD;private BitmapDescriptor bd;private BitmapDescriptor bdGround; /** * 初始化布局控制項 */private void initOfflineLayout() {mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(14.0f); mBaiduMap.setMapStatus(msu);} 2.2初始化覆蓋物,並產生覆蓋物相應的行為,最終設定地圖的狀態
/** * 初始化覆蓋物 */public void initOverlay() {//(LatLng表示座標位置 第一個參數為維度,第一個參數為經度)LatLng llA = new LatLng(39.963175, 116.400244);LatLng llB = new LatLng(39.942821, 116.369199);LatLng llC = new LatLng(39.939723, 116.425541);LatLng llD = new LatLng(39.906965, 116.401394);//LatLng llText = new LatLng(39.86923, 116.397428);//這裡是將表徵圖轉化為對象bdA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);bdB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);bdC = BitmapDescriptorFactory.fromResource(R.drawable.icon_markc);bdD = BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);bd = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);bdGround = BitmapDescriptorFactory.fromResource(R.drawable.ground_overlay);//定義四種不同類型的覆蓋物OverlayOptions ooA = new MarkerOptions().position(llA).icon(bdA).zIndex(9).draggable(true);//OverlayOptions 地圖覆蓋物選型mMarkerA = (Marker) (mBaiduMap.addOverlay(ooA));//addOverlay在當前圖層添加覆蓋物對象OverlayOptions ooB = new MarkerOptions().position(llB).icon(bdB).zIndex(5);mMarkerB = (Marker) (mBaiduMap.addOverlay(ooB));OverlayOptions ooC = new MarkerOptions().position(llC).icon(bdC).perspective(false).anchor(0.5f, 0.5f).rotate(30).zIndex(7);mMarkerC = (Marker) (mBaiduMap.addOverlay(ooC));//將A,B,C三種座標添加到list中ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();giflist.add(bdA);giflist.add(bdB);giflist.add(bdC);OverlayOptions ooD = new MarkerOptions().position(llD).icons(giflist).zIndex(0).period(10);//每隔10毫秒變動下標記(自v3.3.0版本起,SDK提供了給Marker增加動畫的能力)mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));//構建文字Option對象,用於在地圖上添加文字 //OverlayOptions textOption = new TextOptions() // .bgColor(0xAAFFFF00) // .fontSize(24) // .fontColor(0xFFFF00FF) // .text("百度地圖SDK") // .rotate(-30) // .position(llText); ////在地圖上添加該文字對象並顯示 //mMarkerE = (Marker) (mBaiduMap.addOverlay(textOption));// add ground overlayLatLng southwest = new LatLng(39.92235, 116.380338);LatLng northeast = new LatLng(39.947246, 116.414977);LatLngBounds bounds = new LatLngBounds.Builder().include(northeast).include(southwest).build();OverlayOptions ooGround = new GroundOverlayOptions().positionFromBounds(bounds).image(bdGround).transparency(0.8f);mBaiduMap.addOverlay(ooGround);//產生變化地圖狀態MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(bounds.getCenter());//newLatLng設定地圖新中心點//設定地圖狀態mBaiduMap.setMapStatus(u);}
2.3設定座標和地圖的監聽事件
/** * 設定座標和地圖的監聽事件 */ private void initOverlayListener() { //設定座標點擊事件 mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { public boolean onMarkerClick(final Marker marker) { Button button = new Button(getApplicationContext()); button.setBackgroundResource(R.drawable.popup); OnInfoWindowClickListener listener = null; if (marker == mMarkerA || marker == mMarkerD) { button.setText("已變更位元置"); listener = new OnInfoWindowClickListener() { public void onInfoWindowClick() { LatLng ll = marker.getPosition(); LatLng llNew = new LatLng(ll.latitude + 0.005, ll.longitude + 0.005);//改變座標的維度和經度 marker.setPosition(llNew);//設定座標的位置 mBaiduMap.hideInfoWindow();//隱藏訊息窗 } }; LatLng ll = marker.getPosition(); mInfoWindow = new InfoWindow(BitmapDescriptorFactory.fromView(button), ll, -47, listener); mBaiduMap.showInfoWindow(mInfoWindow);//顯示訊息窗 } else if (marker == mMarkerB) { button.setText("更改表徵圖"); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { marker.setIcon(bd);//改變座標的表徵圖 mBaiduMap.hideInfoWindow();//隱藏訊息窗 } }); LatLng ll = marker.getPosition(); mInfoWindow = new InfoWindow(button, ll, -47);//設定訊息窗 mBaiduMap.showInfoWindow(mInfoWindow);//顯示訊息窗 } else if (marker == mMarkerC) { button.setText("刪除"); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { marker.remove();//刪除座標 mBaiduMap.hideInfoWindow();//隱藏訊息窗 } }); LatLng ll = marker.getPosition(); mInfoWindow = new InfoWindow(button, ll, -47);//設定訊息窗 mBaiduMap.showInfoWindow(mInfoWindow);//顯示訊息窗 } return true; } }); //地圖點擊事件 mBaiduMap.setOnMapClickListener(new OnMapClickListener() {@Overridepublic boolean onMapPoiClick(MapPoi arg0) {return false;}@Overridepublic void onMapClick(LatLng arg0) {mBaiduMap.hideInfoWindow();}});}
2.4設定清除和重設按鈕相應的事件
/** * 清除所有Overlay * * @param view */public void clearOverlay(View view) {mBaiduMap.clear();//清除地圖上的所有座標}/** * 重新添加Overlay * * @param view */public void resetOverlay(View view) {clearOverlay(null);initOverlay();}
2.5為了節省電量,設定地圖相應的生命週期(千萬要記住要在onDestroy()方法裡面把bitmap資源回收)
@Overrideprotected void onPause() {// MapView的生命週期與Activity同步,當activity掛起時需調用MapView.onPause()mMapView.onPause();super.onPause();}@Overrideprotected void onResume() {// MapView的生命週期與Activity同步,當activity恢複時需調用MapView.onResume()mMapView.onResume();super.onResume();}@Overrideprotected void onDestroy() {// MapView的生命週期與Activity同步,當activity銷毀時需調用MapView.destroy()mMapView.onDestroy();super.onDestroy();// 回收 bitmap 資源bdA.recycle();bdB.recycle();bdC.recycle();bdD.recycle();bd.recycle();bdGround.recycle();}
好了!介紹完畢!是不是覺得很簡單!
下面為本篇部落格的源碼:
源碼