“摇一摇”快捷工具类

/ 0评 / 0

前言

要想实现"摇一摇"需要使用到系统传感器,由于属于冷门知识点,所以趁着还记得,写了一个工具类,以后需要时候的时候就可以机智的ctrl_c、ctrl_v了

代码实现

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 mSensorManager;

    // 传感器
    private Sensor mSensor;

    // 速度阈值,当摇晃速度达到这值后产生作用
    private static int SPEED_SHRESHOLD = 4000;

    // 两次检测的时间间隔
    private static int UPTATE_INTERVAL_TIME = 50;

    // 两次回调的间隔时间
    private static int CALL_BACK_INTERVAL_TIME = 1000;

    // 手机上一个位置时重力感应坐标
    private float lastX;

    private float lastY;

    private float lastZ;

    // 上次检测时间
    private long mLastUpdateTime;

    // 上次回调的时间
    private long mLastCallBackTime;

    // 摇动监控回调
    private OnShakeListener mOnShakeListener;

    public SensorManagerHelper() {
    }

    /**
     * 开始监听摇一摇事件
     * <p>
     * 注意:在不使用的时候必须调用stop()方法防止泄漏
     */
    public void start(Context context) {
        // 获得传感器管理器
        mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        if (mSensorManager != null) {
            // 获得重力传感器
            mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        }
        // 注册
        if (mSensor != null) {
            mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
        }
    }

    /**
     * 停止监听摇一摇事件
     */
    public void stop() {
        if (mSensorManager != null) {
            mSensorManager.unregisterListener(this);
            mSensor = null;
            mSensorManager = null;
        }
    }

    /**
     * 摇动监听回调
     */
    public interface OnShakeListener {
        public void onShake();
    }

    /**
     * 设置遥控监听回调
     */
    public void setOnShakeListener(OnShakeListener listener) {
        mOnShakeListener = listener;
    }

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

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // 现在检测时间
        long currentUpdateTime = System.currentTimeMillis();
        // 两次检测的时间间隔
        long timeInterval = currentUpdateTime - mLastUpdateTime;
        // 判断是否达到了检测时间间隔
        if (timeInterval < UPTATE_INTERVAL_TIME) {
            return;
        }
        // 现在的时间变成last时间
        mLastUpdateTime = 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 && mOnShakeListener != null) {
            // 防止多次回调,1s回调一次
            if (System.currentTimeMillis() - mLastCallBackTime > CALL_BACK_INTERVAL_TIME) {
                mOnShakeListener.onShake();
                mLastCallBackTime = System.currentTimeMillis();
            }
        }
    }
}

在代码中的调用

// 摇一摇帮助类
private SensorManagerHelper mSensorManagerHelper = new SensorManagerHelper();

//在需要监听的时候调用star()方法,与stop方法成对使用
mSensorManagerHelper.start(this);
mSensorManagerHelper.setOnShakeListener(new OnShakeListener() {

    @Override
    public void onShake() {
        Toast.makeText(MainActivity.this, "摇摇晃晃", Toast.LENGTH_SHORT).show();
    }
});

//回收资源
mSensorManagerHelper.stop();

发表评论

您的电子邮箱地址不会被公开。