命运如同手中的掌纹,无论多曲折,终掌握在自己手中。
本讲内容:使用百度地图
示例一:自定义定位图标并使用方向传感器
1、自定义定位图标
使用MyLocationConfigeration配置类来自定义定位图标,MyLocationConfigeration 构造器有3个参数:
第一个参数 mode:定位图层显示方式, 默认为 LocationMode.NORMAL 普通态
第二个参数 enableDirection:是否允许显示方向信息
第三个参数 customMarker:设置用户自定义定位图标,可以为 null
注意:要导入import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode 否则会报错。
代码如下 :
MyLocationConfiguration config=new MyLocationConfiguration(LocationMode.NORMAL, true, mIconLocation);
mBaiduMap.setMyLocationConfigeration(config);
2、使用方向传感器
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor magneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(sensorListener, magneticSensor,SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(sensorListener, accelerometerSensor,SensorManager.SENSOR_DELAY_FASTEST);
下面是MainActivity.java主界面文件:
public class MainActivity extends Activity {
……
// 自定义定位图标
private BitmapDescriptor mIconLocation;
private SensorManager mSensorManager;//传感器
private float mCurrentZ;//Z轴
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
this.context = this;
initView();
initLocation();
initSensor();
}
……
/**
* 初始化定位
*/
private void initLocation() {
mLocationClient = new LocationClient(getApplicationContext());
mLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(mLocationListener);
LocationClientOption option = new LocationClientOption();
option.setCoorType("bd09ll");// 设置返回的坐标类型(设置返回的定位结果是百度经纬度,默认值gcj02)
option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
option.setOpenGps(true);// 是否打开GPS
option.setScanSpan(1000);// 设置发起定位请求的间隔时间为1000ms onReceiveLocation方法每隔1秒执行一次(要大于1秒)
mLocationClient.setLocOption(option);
// 初始化图标
mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.map_gps_logo);
}
/**
* 初始化传感器
*/
private void initSensor() {
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor magneticSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
Sensor accelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(sensorListener, magneticSensor,SensorManager.SENSOR_DELAY_FASTEST);
mSensorManager.registerListener(sensorListener, accelerometerSensor,SensorManager.SENSOR_DELAY_FASTEST);
}
……
/**
* 定位接口 onReceiveLocation():接收异步返回的定位结果
*/
private class MyLocationListener implements BDLocationListener {
public void onReceiveLocation(BDLocation location) {
if (location == null) {
return;
}
System.out.println(mCurrentZ);
// 当参数比较多时,习惯在类里面建立一个Builder内部类来初始化参数
MyLocationData data = new MyLocationData.Builder()//
.direction(mCurrentZ)//
.accuracy(location.getRadius())//
.latitude(location.getLatitude())//
.longitude(location.getLongitude())//
.build();
mBaiduMap.setMyLocationData(data);
// 设置自定义图标
MyLocationConfiguration config = new MyLocationConfiguration(
LocationMode.NORMAL, true, mIconLocation);
mBaiduMap.setMyLocationConfigeration(config);
// 更新经纬度
mLatitude = location.getLatitude();
mLongtitude = location.getLongitude();
// 使每次发起定位请求不会执行
if (isFirstIn) {
centerToMyLocation();
isFirstIn = false;
Toast.makeText(context, location.getAddrStr(),Toast.LENGTH_LONG).show();
}
}
}
/**
* 方向传感器
*/
private SensorEventListener sensorListener = new SensorEventListener() {
float[] accelerometerValues = new float[3];
float[] magneticValues = new float[3];
private float lastDegreeZ;
public void onSensorChanged(SensorEvent event) {
//判断当前是加速度传感器还是地磁传感器
if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
//注意赋值时要调用clone()方法
accelerometerValues=event.values.clone();
}else if(event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
magneticValues=event.values.clone();
}
float[] R=new float[9];
float[] values=new float[3];
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
SensorManager.getOrientation(R, values);
mCurrentZ=(float) Math.toDegrees(values[0]);
if(Math.abs(mCurrentZ-lastDegreeZ)>1){
lastDegreeZ=mCurrentZ;
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
……
protected void onDestroy() {
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
if(mSensorManager!=null){
mSensorManager.unregisterListener(sensorListener); //关闭传感器
}
}
}
示例二:三种模式切换
<item
android:id="@+id/id_map_mode_common"
android:showAsAction="never"
android:title="普通模式"/>
<item
android:id="@+id/id_map_mode_following"
android:showAsAction="never"
android:title="跟随模式"/>
<item
android:id="@+id/id_map_mode_compass"
android:showAsAction="never"
android:title="罗盘模式"/>
在相应的菜单添加点击事件