安卓摇一摇监听

摇一摇传感器工具类

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 SensorManager sensorManager;
    // 重力感应监听器
    private OnShakeListener onShakeListener;
    // 上下文对象context
    private final Context context;
    //检测的时间间隔
    static final int UPDATE_INTERVAL = 100;
    //上一次检测的时间
    long mLastUpdateTime;
    //上一次检测时,加速度在x、y、z方向上的分量,用于和当前加速度比较求差。
    float mLastX, mLastY, mLastZ;
    //摇晃检测阈值,决定了对摇晃的敏感程度,越小越敏感。
    public int shakeThreshold = 3333;
    //是否出发了摇一摇
    private int mShakeNum = 0;

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

    /**
     * 开始检测
     */
    private void init() {
        // 获得传感器管理器
        sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        startListen();
    }

    //启动监听
    public void startListen() {
        if (sensorManager != null) {
            Sensor 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 onSensorChanged(SensorEvent event) {
        long currentTime = System.currentTimeMillis();
        long diffTime = currentTime - mLastUpdateTime;
        if (diffTime < UPDATE_INTERVAL) {
            return;
        }
        mLastUpdateTime = currentTime;
        float x = event.values[0];
        float y = event.values[1];
        float z = event.values[2];
        float deltaX = x - mLastX;
        float deltaY = y - mLastY;
        float deltaZ = z - mLastZ;
        mLastX = x;
        mLastY = y;
        mLastZ = z;
        float delta = (float) (Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / diffTime * 10000);
        // 当加速度的差值大于指定的阈值,认为这是一个摇晃
        if (delta > shakeThreshold) {
            mShakeNum++;
            if (mShakeNum > 3) {
                mShakeNum = 0;
                onShakeListener.onShake();
            }
        }
    }

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

在基类Activity当中的配置使用

1.在onResume()当中开启监听

private SensorManagerHelper mShakeHelper;

//开启摇一摇监测功能
    private void startShakeListen() {
        if (mShakeHelper == null) {
            mShakeHelper = new SensorManagerHelper(this);
            //这里的监听为SensorManagerHelper.OnShakeListener
            mShakeHelper.setOnShakeListener(this);
        }
        mShakeHelper.startListen();
    }

2.在onPause()当中取消监听

private SensorManagerHelper mShakeHelper;
    //关闭摇一摇监测
    private void stopShakeListen() {
        if (mShakeHelper != null) {
            mShakeHelper.stop();
        }
    }

猜你喜欢

转载自blog.csdn.net/nsacer/article/details/120351111