225_手机摇晃监听器ShakeListener



225_手机摇晃监听器ShakeListener







比如我们要做一个像微信摇一摇这样的功能
那么我们要用到android的传感器


我们可以写一个类实现SensorEventListener


public class ShakeListener implements SensorEventListener {
    
    //速度阈值,当摇晃速度达到这值后产生作用
    private static final int SPEED_SHRESHOLD = 8000;
    //两次检测的时间间隔
    private static final int UPTATE_INTERVAL_TIME = 100;


    //传感器管理器
    private SensorManager sensorManager;
    //传感器
    private Sensor sensor;
    //重力感应监听器
    private OnShakeListener onShakeListener;
    //上下文
    private Context context;
    //手机上一个位置时重力感应坐标
    private float lastX;
    private float lastY;
    private float lastZ;


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


    //构造器
    public ShakeListener(Context c) {
        //获得监听对象
        context = c;
        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 {
        public void onShake();
    }


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




    //重力感应器感应获得变化数据
    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();
    }


    public void onAccuracyChanged(Sensor sensor, int accuracy) {


    }
}






创建对象回调


new ShakeListener(this).setOnShakeListener(new ShakeListener.OnShakeListener() {
            @Override
            public void onShake() {
            }
        });





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值