Android中的传感器之---加速度传感器

加速度传感器

加速度传感器又叫G-sensor,返回x、y、z三轴的加速度数值。

该数值包含地心引力的影响,单位是m/s^2。

将手机平放在桌面上,x轴默认为0,y轴默认0,z轴默认9.81(由于地球的固有重力)。

将手机朝下放在桌面上,z轴为-9.81。

将手机向左倾斜,x轴为正值。

将手机向右倾斜,x轴为负值。

将手机向上倾斜,y轴为负值。

将手机向下倾斜,y轴为正值。

Android 加速度传感器的类型是  Sensor.TYPE_ACCELEROMETER

通过 android.hardware.SensorEvent 返回加速度传感器值。

加速度传感器在手机中应用非常的广泛,在开发的过程当中也非常的简单,(获取到值是真的非常的简单,想要实现某种功能还是需要自己想想怎么加判断吧)

举个栗子:手机摇一摇的功能:

这个算是比较简单的判断了,获取到x,y,z的值之后,对这三个值进行判断,摇一摇手机的话这些值肯定会发生变化,我们定一个阈值,当它们的值超过某一个数字之后就进行了摇一摇,配合代码实现更容易理解

手机摇一摇功能实现

@Override
    public void onSensorChanged(SensorEvent event) {
        // 传感器返回的数据
        float x=event.values[0];
        float y=event.values[1];
        float z=event.values[2];
        StringBuffer buffer = new StringBuffer();
        buffer.append("X方向的加速度为:").append(String.format("%.2f", x)).append("\n");
        buffer.append("Y方向的加速度为:").append(String.format("%.2f", y)).append("\n");
        buffer.append("Z方向的加速度为:").append(String.format("%.2f", z)).append("\n");
        if (x>20||y>20||z>20){
            Toast.makeText(AccelerometerActivity.this,"欢迎使用摇一摇",Toast.LENGTH_SHORT).show();
        }
        mTvAccelerometer.setText(buffer);
    }

上面代码可以看到,通过x,y,z的值的变化来判断手机是否进行了摇一摇,这个判断是比较简单的,思路就是这么个思路,这种判断有缺点,上面判断的是xyz的值不管是哪一个超过了20就认定手机进行了摇一摇,但是忽略了一点,就是用户往一个方向甩动手机也能触发,最好的就是只判断zy,并且判断的xy必须同时超过20才能认定是摇一摇,以下是改过的代码

if (x>20&&y>20){
     Toast.makeText(AccelerometerActivity.this,"欢迎使用摇一摇",Toast.LENGTH_SHORT).show();
}

抬手亮屏

还有相对摇一摇来说复杂一点的功能--抬手亮屏,这个也是对xyz进行判断,这里就不放代码了,简单说一下思路,当我们拿起手机的时候,加速度传感器xyz的值肯定会发生变化,我们可以判断它的结束值,就是手机对着我们的脸的时候传感器的值是个什么样的状态(我低着头对着手机的时候是x:0,y:8,z:5),我们可以对这个值进行判断,在手机200ms内达到这个值就被认定抬手亮屏

代码部分

下面是获取加速度传感器的值以及手机摇一摇的代码

public class AccelerometerActivity extends AppCompatActivity implements SensorEventListener {

    private TextView mTvAccelerometer;
    private SensorManager sensorManager;
    private Sensor sensor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_accelerometer);
        mTvAccelerometer = findViewById(R.id.tv_accelerometer);
        // 获取传感器管理者对象
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        // 获取加速度传感器对象
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (sensorManager!=null){
            // 添加监听器
            sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(sensorManager != null){
            //解除注册
            sensorManager.unregisterListener(this,sensor);
        }
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // 传感器返回的数据
        float x=event.values[0];
        float y=event.values[1];
        float z=event.values[2];
        StringBuffer buffer = new StringBuffer();
        buffer.append("X方向的加速度为:").append(String.format("%.2f", x)).append("\n");
        buffer.append("Y方向的加速度为:").append(String.format("%.2f", y)).append("\n");
        buffer.append("Z方向的加速度为:").append(String.format("%.2f", z)).append("\n");
        if (x>20&&y>20){
            Toast.makeText(AccelerometerActivity.this,"欢迎",Toast.LENGTH_SHORT).show();
        }
        mTvAccelerometer.setText(buffer);
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

更多手机传感器使用请看Android中的传感器(总)

猜你喜欢

转载自blog.csdn.net/lanrenxiaowen/article/details/108057275