android重力感应

来源:互联网 发布:linux nginx 配置域名 编辑:程序博客网 时间:2024/04/27 19:44

    手机和PC的一个比较大的区别就是支持重力感应,所以手机上很多地方都可以利用一下下这个特性~前两天做了一下,现在就总结总结(发现好少哦~)

 

    主要用到的就三个对象:

             /** SensorManager对象 */
                SensorManager sensorMgr;
            /** Sensor对象 */
                android.hardware.Sensor sensor; 【1.5版本之后貌似不支持直接import这个包了,只好用这种方法。。。】
           /** SensorEventListener对象,用于监听 */
                SensorEventListener lsn;

    声明好之后,就可以和手机兄说一声了,请求支援,在oncreate方法里写:【通常这种得到系统服务的操作只能在这里用,所以这个类必须继承activity。。。声音控制的时候也有这种情况】

    sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);

    sensor = sensorMgr .getDefaultSensor(android.hardware.Sensor.TYPE_ACCELEROMETER);

    这里的服务类型是有很多的:

           TYPE_ACCELEROMETER 加速度 ;

           TYPE_ALL 所有类型,NexusOne默认为加速度;

           TYPE_GYROSCOPE 回转仪(这个不太懂));

           TYPE_LIGHT光线感应;

           TYPE_MAGNETIC_FIELD 磁场;

           TYPE_ORIENTATION 定向(指北针)和角度;

           TYPE_PRESSUR 压力计 ;

           TYPE_PROXIMITY 近似。。。(依旧不懂);

           intTYPE_TEMPERATURE 温度

    种类是很多,不过貌似常用的只有第一个,其他的也很少能查到什么资料,以后研究研究了再说吧。。。小小偷懒下

 

    到此为止准备工作就完成了,之后就是监听。

    注册监听:sensorMgr.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);

               灵敏度依旧有几个选项:SENSOR_DELAY_FASTEST     最灵敏,快的无语
                                                           SENSOR_DELAY_GAME           游戏的时候用这个,不过一般用这个就够了,和上一个很难看出区别 
                                                           SENSOR_DELAY_NORMAL     比较慢。

                                                           SENSOR_DELAY_UI                  最慢的,几乎就是横和纵的区别
    取消监听:sensorMgr.unregisterListener(lsn, sensor);

 

    Last but not least ......【英语考试后遗症。。。】 其实最最重要的是完成这些步骤之后,可以得到手机的位置参数x,y,z。至于用这些参数做什么,那就得具体情况具体分析了。

    lsn = new SensorEventListener() {
         public void onSensorChanged(SensorEvent e) {
             x = e.values[SensorManager.DATA_X];
             y = e.values[SensorManager.DATA_Y];
             z = e.values[SensorManager.DATA_Z];
             act(x, y, z);      //这里写自己需要的任何操作,最简单的就是根据坐标移动位置了,当然复杂一点可以计算角度之类的,数学的力量是无穷的啊无穷的~
   }
   @Override
   public void onAccuracyChanged(android.hardware.Sensor sensor, int accuracy) {}
  };

     三个坐标的空间坐标轴如图所示(绿色),float类型,取值范围是-10~10,与地面平行时为0,正方向远离地面(向上)时为正数,竖直向上时为10;指向地面(向下)为负数,竖直向下为-10。如,当水平放置是为(0,0,10)。

     要注意的是,这个坐标系的原点和二维确定位置的坐标系(红色)不同,所以正负上也会不太一样,记得在某本书上见到是说这个坐标系是模仿飞行系统里面的,可以把手机想象成飞机。。。关于这个坐标轴的一些术语还是和那个一样的说。。。

   

   

原创粉丝点击