Android编程之重力感应讲解

首先要知道重力感应是依靠手机的加速度传感器(accelerometer)实现的

其实所有的传感器的调用步骤都大同小异,如下

1.     声明传感管理对象SensorMannager

调用getSystemService(SENSOR_SERVICE)方法就可以拿到传感器管理对象。

privateSensorManagermSensorManager= null;

mSensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);

2.     实现SensorEventListener接口

实现此接口中的onSensorChanged(SensorEventevent)方法来捕获手机传感器的状态

SensorEventListenerlsn = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {
        x = event.values[SensorManager.DATA_X];
        y = event.values[SensorManager.DATA_Y];
        z = event.values[SensorManager.DATA_Z];
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub
    }
};

这里简单讲解下重力传感器的数据,

假设当地的重力加速度值为g,其中g是物理学中的重力加速度,一般是9.81
当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g
当手机右侧面朝上的时候,x的值为g,右侧面朝上的时候,x的值为-g
当手机上侧面朝上的时候,y的值为g,右侧面朝上的时候,y的值为-g

如:

手机屏幕向上(z轴朝天)水平放置的时侯,(x,y,z)的值分别为(0,0,10);
手机屏幕向下(z轴朝地)水平放置的时侯,(x,y,z)的值分别为(0,0,-10);

3.     注册SensorEventListener

使用传感管理对象SensorMannager调用registerListener()方法来注册,调用unregisterListener反注册,第三个参数是检测的灵敏精确度,一般在onReusme中实现,参数三为灵敏度

public void onResume(){
    mSensorManager.registerListener(lsn, mSensor, SensorManager.SENSOR_DELAY_GAME);
    super.onResume();
}

这样之后就可以拿到传感器对象了,如下

private Sensor mSensor = null;
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

这里补充下手机的一些传感器:重力感应需要借助加速度传感器

加速度传感器(accelerometer)
陀螺仪传感器(gyroscope)
环境光照传感器(light)
磁力传感器(magnetic field)
方向传感器(orientation)
压力传感器(pressure)
距离传感器(proximity)
温度传感器(temperature)

4.     重力感应简单速度计算的方式

每次摇晃手机计算出 X轴 Y轴 Z轴的重力分量可以将它们记录下来 然后每次摇晃的重力分量和之前的重力分量可以做一个对比,根据物理学公式(x=vt),利用差值和时间就可以计算出他们的移动速度。

5.      项目原码如下:

6.   public class MainActivity extends AppCompatActivity {
    //1.SensorMannager传感器管理对象,手机中的所有传感器都须要通过SensorMannager来访问,调用getSystemService (SENSOR_SERVICE)方法就可以拿到当前手机的传感器管理对象。
    private SensorManager mSensorManager = null;
    private Sensor mSensor = null;
    //xyz轴参数
    private float x, y, z;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);
        //SensorMannager传感器管理对象
        mSensorManager = (SensorManager)this.getSystemService(SENSOR_SERVICE);
        //拿到加速重力感应的Sensor对象
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }
    //2.实现SensorEventListener接口,实现SensorEventListener接口onSensorChanged(SensorEventevent)方法来捕获手机传感器的状态
    SensorEventListener lsn = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent event) {
            x = event.values[SensorManager.DATA_X];
            y = event.values[SensorManager.DATA_Y];
            z = event.values[SensorManager.DATA_Z];
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub
        }
    };
    @Override
    public boolean onTouchEvent(MotionEvent event){
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            mSensorManager.registerListener(lsn, mSensor, SensorManager.SENSOR_DELAY_GAME);
            String str = "x=" + x + "; y=" + y + "; z=" + z;
            Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
        }
        return super.onTouchEvent(event);
    }
    @Override
    public void onResume(){
        //3.注册SensorEventListener,调用registerListener()方法来注册,第三个参数是检测的灵敏精确度,
        mSensorManager.registerListener(lsn, mSensor, SensorManager.SENSOR_DELAY_GAME);
        super.onResume();
    }
    @Override
    public void onPause(){
        mSensorManager.unregisterListener(lsn);
        super.onPause();
    }
}

 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amarao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值