百度地图有专门一个方法设置当前位置,显示效果是一个小蓝点,并且始终在地图图层的最上面。通过结合百度地图定位,与Android的传感器做出与地图应用实时导航并显示方向的效果。
设置点位样式
这个一定要设,不然点显示方向的三角显示不出来。也可以用自定义图标代替原有样式,图标箭头指向朝上即可。
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.pos_blue_arrow_up);
MyLocationConfiguration confit = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, bitmap);//不需要自定义,bitmap设置为null
baiduMap.setMyLocationConfigeration(confit);
LocationMode有三种
- NORMAL 就是最普通的一个点加一个三角
- FOLLOWING 是NORMAL把点锁定在地图中央
- COMPASS 比较高级,会把地图转成3D视角并锁定在地图中央(与FOLLOWING类似),适合导航
设置点
可以申请个全局MyLocationData.Builder,设置范围为30米(点外外围显示一个篮圈,可以更直观的看距离自己30米范围的地图标识),
LocBuilder = new MyLocationData.Builder()
.accuracy(30);
在定位回调中设置坐标
LocBuilder.latitude(latitude)
.longitude(longtitude);
设置位置方法
private void showCurrentPos() {
MyLocationData locData = LocBuilder.build();
baiduMap.setMyLocationData(locData);
}
封装工具
Android传感器工具类
public class SensorServiceUtil {
private static final String TAG = "SensorServiceUtil";
private static SensorServiceUtil instance;
private DirectionListener listener;
public static SensorServiceUtil getInstance(Context context) {
if (instance == null) {
instance = new SensorServiceUtil(context);
}
return instance;
}
Context context;
SensorManager sensorManager;
private SensorServiceUtil(Context context) {
this.context = context.getApplicationContext();
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
}
public void startSensorService() {
sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
}
public void startSensorService(DirectionListener listener) {
this.listener = listener;
startSensorService();
}
public DirectionListener getListener() {
return listener;
}
public void setListener(DirectionListener listener) {
this.listener = listener;
}
public void stopSensorService(){
sensorManager.unregisterListener(sensorEventListener);
listener = null;
}
private SensorEventListener sensorEventListener = new SensorEventListener() {
float[] accelerometerValues = new float[3];
float[] magneticFieldValues = new float[3];
float olDegree;
final float sensitivity = 5;
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticFieldValues = event.values.clone();
}
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = event.values.clone();
}
float[] values = new float[3];
float[] R = new float[9];
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues);
SensorManager.getOrientation(R, values);
float degree = (float) Math.toDegrees(values[0]);
if (Math.abs(degree - olDegree) > sensitivity) {
olDegree = degree;
if(listener != null){
listener.onDirectionListener(degree);
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
public interface DirectionListener {
void onDirectionListener(float degree);
}
}
接受Android传感器数据,设置方向
SensorServiceUtil.getInstance(this).startSensorService(new SensorServiceUtil.DirectionListener() {
@Override
public void onDirectionListener(float degree) {
LocBuilder.direction(degree);
showCurrentPos();
}
});
注意销毁Activity时调用stop方法注销回调
SensorServiceUtil.getInstance(this).stopSensorService();