讓地圖顯示出來android
修改activity_main.xml中的代碼git
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 7 <TextView 8 android:id="@+id/position_text_view" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:visibility="gone"/> 12 13 <com.baidu.mapapi.map.MapView 14 android:id="@+id/bmapView" 15 android:layout_width="match_parent" 16 android:layout_height="match_parent" 17 android:clickable="true"/> 18 19 </LinearLayout>
由於TextView如今暫時用不到了。因此先給TextView增長了一個visibility屬性,並指定爲gone。將其隱藏起來。api
修改Mainctivity中的代碼,以下所示:ide
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 //建立一個LocationClient的實例,接受的context經過getApplicationContext()方法獲取。 5 mLocationClient = new LocationClient(getApplicationContext()); 6 //調用LocationClient的registerLocationListener()方法來註冊一個監聽器 當獲取到位置信息的時候,就會回調這個定位監聽器 7 mLocationClient.registerLocationListener(new MyLocationListener()); 8 SDKInitializer.initialize(getApplicationContext()); 9 setContentView(R.layout.activity_main); 10 mapView = (MapView)findViewById(R.id.bmapView);
1 @Override 2 protected void onResume(){ 3 super.onResume(); 4 mapView.onResume(); 5 } 6 7 @Override 8 protected void onPause(){ 9 super.onPause(); 10 mapView.onPause(); 11 } 12 @Override 13 protected void onDestroy(){ 14 super.onDestroy(); 15 mLocationClient.stop(); 16 mapView.onDestroy(); 17 }
首先調用SDKInitialzer的initialize()方法來進行初始化操做。 initialize()方法接受一個context參數。這裏調用getApplicationContext()方法來獲取一個全局的context參數並傳入。ui
接下來獲取到MapView()的實例。spa
另外還要重寫onResume()方法,onPause()方法,onDestroy()方法。在這裏對MapView進行管理,以保證資源可以及時釋放。code
移動到個人位置xml
百度LBS SDK的API提供了一個BaiduMap類,是地圖的總提供器,調用MapView的getMap()方法就能獲取到BaiduMap的實例。以下所示:對象
BaiduMap baiduMap = mapView.getMap();
BaiduMap能夠設置地圖的縮放級別以及將地圖移動到某一個經緯度上。blog
百度地圖能夠將縮放級別的取值範圍定在3到19之間,值越大,地圖越精細。
1 MapStatusUpdate update = MapStatusUpdateFactory.zoomTo(16f); //其中小數點位的值也是能夠取的 2 baiduMap.animateMapStatus(update);
其中MapStatusUpdateFactory的zoomTo()方法接受一個float型參數,用於設置縮放級別。
zoomTo()方法返回一個MapStatusUpdate對象,咱們把這個對象傳入BaiduMap的animateMapStatus()方法當中便可完成縮放功能。
若是要讓地圖移動到某一個經緯度上,就要藉助LatLng類,LatLng類主要用於存放經緯度值,它的構造方法接受兩個參數,第一個參數是緯度值,第二個參數是經度值。
以後調用MapStatusUpdateFactory的newLatLng()方法將LatLng對象傳入。 newLatLng()方法返回的也是一個MapStatusUpdate對象,再把這個對象傳入BaiduMap的animateMapStatus()方法中。就能夠將地圖移動到指定的經緯度上了。
LatLng ll = new LatLng(39.915,116.400); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update);
繼續修改LBSTest這個項目
修改MainActivity中的代碼
1 public class MainActivity extends AppCompatActivity { 2 ...... 3 private BaiduMap baiduMap; 4 5 private boolean isFirstLocate = true; //爲了防止屢次調用animateMapStatus()方法,由於將地圖移動到咱們當前的位置只須要在第一次定位的時候調用一次就能夠了。 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 //建立一個LocationClient的實例,接受的context經過getApplicationContext()方法獲取。 11 mLocationClient = new LocationClient(getApplicationContext()); 12 //調用LocationClient的registerLocationListener()方法來註冊一個監聽器 當獲取到位置信息的時候,就會回調這個定位監聽器 13 mLocationClient.registerLocationListener(new MyLocationListener()); 14 SDKInitializer.initialize(getApplicationContext()); 15 setContentView(R.layout.activity_main); 16 mapView = (MapView)findViewById(R.id.bmapView); 17 baiduMap = mapView.getMap(); 18 .... 19 } 20 private void navigateTo(BDLocation location){ 21 if(isFirstLocate){ 22 //將BDLocation對象中的地理位置信息取出並封裝到LatLng對象中。 23 LatLng ll = new LatLng(location.getAltitude(),location.getLongitude()); 24 //調用MapStatusUpdateFactory的newLatLng()方法將LatLng對象傳入 25 MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); 26 //將返回的MapStatusUpdate對象做爲參數傳入到BaiduMap的animateMapStatus()方法當中。 27 baiduMap.animateMapStatus(update); 28 //將縮放級別設置爲16 29 update = MapStatusUpdateFactory.zoomTo(16f); 30 baiduMap.animateMapStatus(update); 31 //改成false 僅調用一次。 32 isFirstLocate = false; 33 } 34 } 35 36 public class MyLocationListener implements BDLocationListener{ 37 @Override 38 public void onReceiveLocation(final BDLocation location) { 39 if(location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation){ 40 navigateTo(location); //最後當定位到設備當前位置的時候 咱們在onReceiveLocation()方法中直接把BDLocation對象傳遞給navigateTo()方法,這樣就能讓地圖移動到設備所在位置了。 41 } 42 }
讓我顯示在地圖上
百度LBS SDK當中提供了一個MyLocationData.Builder類,這個類是用來封裝設備當前所在位置的,咱們只須要將經緯度信息傳入這個類的相應方法當中就能夠了。以下所示:
MyLocationData.Builder locationBuilder = new MyLocationData.Builder() locationBuilder.latitude(39.915); locationBuilder.latitude(116.404);
MyLocationData.Builder類中還提供了一個build()方法,當咱們把要封裝的信息都設置完成以後,只須要調用它的build()方法,就會生成一個MyLocationData的實例,而後再將這個實例傳入到BaiduMap的setMyLocationData()方法當中,就可讓設備當前的位置顯示在地圖上了。寫法以下:
MyLocationData locationData = locationBuilder().build();
baiduMap.setMyLocationData(locationData);
接下來修改MainActivity中的代碼:
@Override protected void onCreate(Bundle savedInstanceState) { ... super.onCreate(savedInstanceState); //建立一個LocationClient的實例,接受的context經過getApplicationContext()方法獲取。 mLocationClient = new LocationClient(getApplicationContext()); //調用LocationClient的registerLocationListener()方法來註冊一個監聽器 當獲取到位置信息的時候,就會回調這個定位監聽器 mLocationClient.registerLocationListener(new MyLocationListener()); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mapView = (MapView)findViewById(R.id.bmapView); baiduMap = mapView.getMap(); baiduMap.setMyLocationEnabled(true); ... }
1 private void navigateTo(BDLocation location){ 2 if(isFirstLocate){ 3 //將BDLocation對象中的地理位置信息取出並封裝到LatLng對象中。 4 LatLng ll = new LatLng(location.getAltitude(),location.getLongitude()); 5 //調用MapStatusUpdateFactory的newLatLng()方法將LatLng對象傳入 6 MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); 7 //將返回的MapStatusUpdate對象做爲參數傳入到BaiduMap的animateMapStatus()方法當中。 8 baiduMap.animateMapStatus(update); 9 //將縮放級別設置爲16 10 update = MapStatusUpdateFactory.zoomTo(16f); 11 baiduMap.animateMapStatus(update); 12 //改成false 僅調用一次。 13 isFirstLocate = false; 14 } 15 MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); 16 locationBuilder.latitude(location.getLatitude()); 17 locationBuilder.longitude(location.getLongitude()); 18 MyLocationData locationData = locationBuilder.build(); 19 baiduMap.setMyLocationData(locationData); 20 }
1 @Override 2 protected void onDestroy(){ 3 super.onDestroy(); 4 mLocationClient.stop(); 5 mapView.onDestroy(); 6 baiduMap.setBuildingsEnabled(false); 7 }