摇一摇,可以监听开始与完成

安卓端做摇一摇,主要运用到SensorManager 这个类,通过重力传感器,获取xyz三轴的位置变化,来判断是否是摇动

一、SensorManager 初始化 注册SensorManager

//获取 SensorManager 负责管理传感器
mSensorManager = ((SensorManager) getSystemService(SENSOR_SERVICE));
if (mSensorManager != null) {
    //获取加速度传感器
    mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    if (mAccelerometerSensor != null) {
        mSensorManager.registerListener(this, mAccelerometerSensor, SensorManager.SENSOR_DELAY_UI;
    }
}
二、onPause方法中注销SensorManager
@Override
protected void onPause() {
    // 务必要在pause中注销 mSensorManager
    // 否则会造成界面退出后摇一摇依旧生效的bug
    if (mSensorManager != null) {
        mSensorManager.unregisterListener(this);
    }
    super.onPause();
}
三、监听重力感应事件,让activity实现SensorEventListener监听,重写onSensorChanged和onAccuracyChanged方法
//此方法可以获取到手机的xyz方向的数值,根据此数值判断是否是摇一摇动作
@Override
public void onSensorChanged(SensorEvent event) {
    int type = event.sensor.getType();

    if (type == Sensor.TYPE_ACCELEROMETER) {
        //获取三个方向值
        float[] values = event.values;
        float x = values[0];
        float y = values[1];
        float z = values[2];

        if ((Math.abs(x) > 17 || Math.abs(y) > 17 || Math
                .abs(z) > 17) && !isShake) {
            isShake = true;
            // TODO: 2016/10/19 实现摇动逻辑, 摇动后进行震动
            Thread thread = new Thread() {
                @Override
                public void run() {
                    super.run();
                    try {
                        //开始震动 发出提示音 展示动画效果
                        mHandler.obtainMessage(START_SHAKE).sendToTarget();
                        Thread.sleep(500);
                        //再来一次震动提示
                        mHandler.obtainMessage(AGAIN_SHAKE).sendToTarget();
                        Thread.sleep(500);
                        mHandler.obtainMessage(END_SHAKE).sendToTarget();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            thread.start();
        }
    }
}

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

}
四、Handler来处理摇一摇开始和完成事件,所有处理的逻辑。
 
 
private class MyHandler extends Handler { private WeakReference<ChristmasWebActivity> mReference; private ChristmasWebActivity mActivity; public MyHandler(ChristmasWebActivity activity) { mReference = new WeakReference<ChristmasWebActivity>(activity); if (mReference != null) { mActivity = mReference.get(); } } @Override  public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case START_SHAKE: // 开始摇一摇   break; case AGAIN_SHAKE: //继续摇晃 不作处理 // mActivity.mVibrator.vibrate(300);  break; case END_SHAKE: //结束摇一摇 整体效果结束, 将震动设置为false  mActivity.isShake = false; // 展示上下两种图片回来的效果  //结束之后开启动画。   break; } } }

注意:手机震动需要加入震动权限

<uses-permission android:name="android.permission.VIBRATE"></uses-permission>
 

猜你喜欢

转载自blog.csdn.net/lzq520210/article/details/53581974