让地图显示出来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 }