百度SDK之方向传感器的应用

如今大部分智能手机都有各种各样的传感器,在上两篇博客里面,我们学习了如何显示地图以及如何在地图上找到自己的位置。

接下来,我们要结合方向传感器来配合手机来回移动。

先拉出效果图看看。
这里写图片描述
不多说了,下面就是撸代码的时候了。
首先我们需要一个图标来表示方向,这个我就不往上传了,需要的同学就联系我。
如何初始化图标呢?
我们需要先定义一个BitmapDescriptor对象,然后对它进行初始化

private BitmapDescriptor mIconLocation;
mIconLocation= BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked);
        //初始化图标

这样设置以后,我们就可以在手机上看到效果了,不过我们会发现无论怎样晃动手机,方向都不会改变。

导航图标出现了,那么如何让它跟随手机移动呢?

我们这是需要新建一个类,并且实现Sensor接口,用来获取手机系统服务。既然是要获得手机本身的传感器服务,那么我们就需要实例化一个SensorManager对象,再接着实例化一个Sensor对象,当然我们也可以实例化一个全文环境Context.

private SensorManager mSensorManager;
    private Context mContext;
    private Sensor mSensor;

我们还要在这个类里面写一个onSensorChanged()方法,用来写当我们晃动手机时的逻辑代码。不过我们暂时先不写。为了设置方向传感器的关闭和开启,我们还需要在这个类里面设置两个方法,start()开启传感器,stop()方法关闭传感器。这里我们在设置一个构造方法,传入参数Context.

public Direction(Context context){
        this.mContext=context;
    }
    public void start(){
    }//用于开启传感器
    public void stop(){
    }//关闭传感器
    public void onSensorChanged(SensorEvent event){
    }//手机晃动的逻辑代码

然后我们接着在start()方法里面Context的getSystemService(Context.SENSOR_SERVICE)方法并且强制转化为SensorManager对象,以此来获取手机传感器服务,不过我们还需要进行判断,如果SensorManager对象不为空的话,再通过SensorManager对象的getDefaultSensor(Sensor.TYPE_ORIENTATION)获得方向传感器,把它转给Sensor对象。

mSensorManager=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
        if (mSensorManager!=null){
         mSensor=  mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        //获得方向传感器
        }
        if(mSensor!=null){
            mSensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_UI);
        }

在代码里,我们还要对Sensor对象判断是否为空,不为空的话,就通过SensorManager.registerListener()来开启方向传感器,注意我们传入的最后一个参数是关于灵敏度设置的。这样的话我们就把start()方法里面的内容全给写好了。
在stop()方法里面我们至于添加

mSensorManager.unregisterListener(this);

来关闭传感器服务。

接下来,我们就需要在onSensorChanged()方法来写逻辑代码了

首先我们要注意的是这个方法里我们传入了SensorEvent实例
,判断得到的传感器服务类型是为方向传感器以后,我们需要定义一个float类型的对象来存储此时的X轴方向,为了进行对比,我们在刚开始的时候需要定义一个最初的X轴位置。

 private float lastX;
 public void onSensorChanged(SensorEvent event){
        if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){

            float x=event.values[SensorManager.DATA_X];
 .......
  }
}

剩下我们就需要在这个方法里面添加回调函数了,就是当x轴位置坐标改变之后进行的活动。这时候,我们需要再定义一个接口。

public interface OnOrientationListener {
        void onOrientationChanged(float x);
    }
}

实例化这个接口之后再设置一个方法

public void setOnOrientationListener(OnOrientationListener mOnOrientationListener){
       this.mOnOrientationListener=mOnOrientationListener;
    }

这样之后我们就可以添加自己的回调函数了。

if(Math.abs(x-lastX)>0.2){
                if (mOnOrientationListener!=null){
                    mOnOrientationListener.onOrientationChanged(x);
                }

            }
            lastX=x;

为了让方向变化随手机移动更明显一些,我在这里设置了当x坐标改变超过0.2时就发生变化。
这样的话,我们就把实现Sensor接口的这个类完成了。
剩下的就是在主活动里面添加代码了。
为了不让大家感觉篇幅过多,我把这部分放在下一篇博客里面,并且在下一篇博客里面讲下如何切换卫星地图,如何添加实时地图,以及如何找到我的位置。

我也是安卓开发的新手,写的难免会有什么错误,希望大神看到的话,可以帮忙指出来。

这里写图片描述

发布了37 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/OneLinee/article/details/78306084