关于重力感应的一个小例子

来源:互联网 发布:ruby精粹专家编程 pdf 编辑:程序博客网 时间:2024/04/30 11:29

                       关于重力感应的一个小例子

         最近在做一个关于遥控小车的小项目,它可以通过手机实现重力感应操作、语音识别操作、实时视频传输以及地图定位等功能。当然,在这里只说重力感应这一点。

         那么,我们就来说说手机的重力感应系统,它是通过对重力加速度敏感的传感器,感受手机的姿势变换,使手机光标的位置发生相应的变化,从而实现方向的改变。

        具体来讲就是,利用手机内置的重力加速计,根据测量到的重力加速度方向在手机平面上两个坐标轴上的分量,来判断在手机上平面上的方向,并将它作为水平方向上的前后左右方向。 并将方向信息,通过手机蓝牙发送到小车,小车根据相应的方向信息调整自身的方向。

        首先,我们不要求一开始就实现上述功能,我只需要实现简单的重力感应功能即可,并将其显示在屏幕上。要实现重力感应,我们得先建立三维坐标,即X轴、Y轴、Z轴。XY轴在手机平面上,而Z轴垂直于手机平面。

        画界面,这界面不难,这里就不多说了,这需要定义四个TextView与三个EditText即可。四个TextView分别是“重力感应”、“X轴”、“Y轴”、“Z轴”,三个EditText分别是“Edit_XEdit_Y”、“Edit_Z”分别将重力感应的三个坐标分量显示出来。

         我们知道,重力感应式手机自带的,我们只需要调用相关函数即可。所以,代码已不是很难,只是一般我们平时没去了解而已。

         我们只需要定义一个重力感应监听事件SensorEventListener的对象mListener、一个重力感应管理SensorManager类型的mManager

,一个重力感应mSensor。

在打开的时候自动获取焦点,在获取焦点的同时,程序执行,在失去焦点时将自动退出程序。

代码片段如下:

 

mManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);

mSensor mManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

private SensorEventListener mListener = new SensorEventListener() {

        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        

        }

        public void onSensorChanged(SensorEvent event) {

        float x = (int)(event.values[SensorManager.DATA_X]*10);

        float y = (int)(event.values[SensorManager.DATA_Y]*10);

        float z = (int)(event.values[SensorManager.DATA_Z]*10);

         //要做的事情

        doSomething(x, y, z);

        }

    };

    

    //显示坐标到界面上

    public void doSomething(float x,float y,float z){

     edit_x.setText(x+"");

     edit_y.setText(y+"");

     edit_z.setText(z+"");

    }

 

protected void onResume() {

super.onResume();

         mManager.registerListener(mListener,mSensor,SensorManager.

          SENSOR_DELAY_GAME);

}

protected void onPause() {

super.onPause();

    mManager.unregisterListener(mListener);

}

 public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

    

}

        本来,这个重力感应是很敏感的,放在我们认为静止的桌子上,X轴与Y轴的显示数据都不停地跳动。但经过我调整之后,将xyz的值分别乘以10之后再取整,就没那么敏感了!

即:

 float x = (int)(event.values[SensorManager.DATA_X]*10);

 float y = (int)(event.values[SensorManager.DATA_Y]*10);

 float z = (int)(event.values[SensorManager.DATA_Z]*10);

        实现的截图在这也就不传了,仅仅只是一个很简单很简洁的一个界面,毕竟仅仅只是用来获取重力感应的分量的。

        好了,废话说得多了!这里就不再细讲了。

原创粉丝点击