安卓端做摇一摇,主要运用到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>