Android之使用重力感应器(java代码)

615 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

在当今的app中 有许多都应用到了重力传感器来处理一些问题

而我们应该如何去使用呢 代码如下


package com.example.light;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class SensorManagerHelper implements SensorEventListener {

    // 速度阈值,当摇晃速度达到这值后产生作用
    private final int SPEED_SHRESHOLD = 500;
    // 两次检测的时间间隔
    private final int UPTATE_INTERVAL_TIME = 50;
    // 传感器管理器
    private SensorManager sensorManager;
    // 传感器
    private Sensor sensor;
    // 重力感应监听器
    private OnShakeListener onShakeListener;

    // 重力感应监听器
    private OnShakeListener onShakeListener1;
    // 上下文对象context
    private Context context;
    // 手机上一个位置时重力感应坐标
    private float lastX;
    private float lastY;
    private float lastZ;
    // 上次检测时间
    private long lastUpdateTime;

    public SensorManagerHelper(Context context) {
        this.context = context;
        start();
    }

    /**
     * 开始检测
     */
    public void start() {
                // 获得传感器管理器
                sensorManager = (SensorManager) context
                .getSystemService(Context.SENSOR_SERVICE);
        if (sensorManager != null) {
            // 获得重力传感器
            sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        }
        // 注册
        if (sensor != null) {
            sensorManager.registerListener(this, sensor,
                    SensorManager.SENSOR_DELAY_GAME);
        }
    }

    /**
     * 停止检测
     */
    public void stop() {
        sensorManager.unregisterListener(this);

    }

    /**
     * 摇晃监听接口
     */
    public interface OnShakeListener {
        void onShake();

    }

    /**
     * 设置重力感应监听器
     */
    public void setOnShakeListener(OnShakeListener listener) {
        onShakeListener = listener;
    }

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

    /**
     * 重力感应器感应获得变化数据
     * android.hardware.SensorEventListener#onSensorChanged(android.hardware
     * .SensorEvent)
     */
    @Override
    public void onSensorChanged(SensorEvent event) {
        // 现在检测时间
        long currentUpdateTime = System.currentTimeMillis();
        // 两次检测的时间间隔
        long timeInterval = currentUpdateTime - lastUpdateTime;
        // 判断是否达到了检测时间间隔
        if (timeInterval < UPTATE_INTERVAL_TIME) return;
        // 现在的时间变成last时间
        lastUpdateTime = currentUpdateTime;
        // 获得x,y,z坐标
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
        // 获得x,y,z的变化值
        float deltaX = x - lastX;
        float deltaY = y - lastY;
        float deltaZ = z - lastZ;
        // 将现在的坐标变成last坐标
        lastX = x;
        lastY = y;
        lastZ = z;
        double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
                * deltaZ)
                / timeInterval * 10000;
        // 达到速度阀值,发出提示
        if (speed >= SPEED_SHRESHOLD) {
            onShakeListener.onShake();
        }

    }

}

首先我们可以创建一个类作为SensorEventListener的接口

然后定义一些我们需要的变量

其中代码里面都有详细解释 我就不讲啥东西了

其中最重要的是

    // 手机上一个位置时重力感应坐标
    private float lastX;
    private float lastY;
    private float lastZ;
    
    因为使用重力传感器时 要建立一个三个方向的坐标系 然后记录手机到达的坐标 然后计算出是在那个位置
    

和 通过 Math.sqrt计算变化量的平方根 然后除于我们检测间隔时间的毫秒乘于10000

        double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
              * deltaZ)
              / timeInterval * 10000;
                  

而怎么在activity里使用这个东西呢 也很简单

创建一个我们实现了SensorEventListener接口的类

然后调用类里实现的监听器 和 我们使用这个监听器要使用的方法

SensorManagerHelper sensorHelper = new SensorManagerHelper(this);
sensorHelper.setOnShakeListener(()-> xx());