您的位置:首页 > 移动开发 > Android开发

android 实现手机摇一摇功能

2014-08-09 00:26 405 查看
实现接口SensorEventListener

public abstract class ShakeListenerUtils implements SensorEventListener {

public Context context = null;
private String TAG = "ShakeListenerUtils";

public ShakeListenerUtils(Context context) {
super();
this.context = context;
}

@Override
public void onSensorChanged(SensorEvent event) {
int sensorType = event.sensor.getType();
//values[0]:X轴,values[1]:Y轴,values[2]:Z轴
float[] values = event.values;

if (sensorType == Sensor.TYPE_ACCELEROMETER) {

/*正常情况下,任意轴数值最大就在9.8~10之间,只有在突然摇动手机
的时候,瞬时加速度才会突然增大或减少。   监听任一轴的加速度大于17即可
*/
if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math
.abs(values[2]) > 17)) {
Log.d(TAG, "shake");
//根据上一次摇一摇的时间,防止连续摇手机,不停切换界面
KVManager kvManager = new KVManager(context);
Calendar calendar = Calendar.getInstance();
long tmp = calendar.getTimeInMillis();
long last = kvManager.getLong("shake_time", 0);
kvManager.setLong("shake_time", tmp);
if (tmp - last >= 1000)

onShake();
}
}
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
//当传感器精度改变时回调该方法,Do nothing.
}

public abstract void onShake();
}


在Activity里使用

private ShakeListenerUtils shakeListenerUtils = null;
private SensorManager mSensorManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
initListener();
shakeListenerUtils = new ShakeListenerUtils(this) {
@Override
public void onShake() {
Toast.makeText(MainActivity.this, "onShake", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Const.BROADCAST_ENCODE);
sendBroadcast(intent);
}
};
}

@Override
protected void onResume() {
super.onResume();
//获取传感器管理服务
mSensorManager = (SensorManager) this
.getSystemService(Service.SENSOR_SERVICE);
//加速度传感器
mSensorManager.registerListener(shakeListenerUtils,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
//还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,
//根据不同应用,需要的反应速率不同,具体根据实际情况设定
SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(shakeListenerUtils);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: