Android百度地图显示当前位置方向

Android百度地图显示当前位置方向


百度地图有专门一个方法设置当前位置,显示效果是一个小蓝点,并且始终在地图图层的最上面。通过结合百度地图定位,与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有三种

  1. NORMAL 就是最普通的一个点加一个三角
  2. FOLLOWING 是NORMAL把点锁定在地图中央
  3. 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();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值