摇一摇功能其实就是检测手机加速度传感器数值变化,如果其超过某阀值,认为手机被用户摇动。
参看一下安卓手机加速度传感器示意图(图片来自网络):
所以我们应该检测x 和 y 轴的数值变化。思路定了。下面是过程:
在判断手机摇动后让手机产生一个震动,这个震动需要一下权限:
在AndroidManifest.xml中加入:
<uses-permission android:name="android.permission.VIBRATE"/>
具体代码:
package com.example;
import com.SensorTest.SensorTest;
import com.example.shakedemo.R;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.Toast;
/**
* android 摇一摇实现
*
* @author vigor
*
*/
public class ShakeActivity extends Activity {
private SensorManager mSensorManager;
private Vibrator vibrator;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shake_ativity);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
}
//这里注册对传感器的监听
public void onResume() {
super.onResume();
mSensorManager.registerListener(sensorEventListener,
mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
//这里取消注册对传感器的监听
public void onPause() {
super.onPause();
mSensorManager.unregisterListener(sensorEventListener);
}
/**
* 传感器监听
*/
private SensorEventListener sensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
// 传感器信息改变时执行该方法
float[] values = event.values;
float x = values[0]; // x轴方向的加速度,向右为正
float y = values[1]; // y轴方向的加速度,向前为正
float z = values[2]; // z轴方向的加速度,向上为正
int threshold = 9;// 阈值,可调。
if (Math.abs(x) > threshold || Math.abs(y) > threshold) {
// 这里仅比较了x 轴和 y 轴的数值
vibrator.vibrate(200);// 参数为震动时间的毫秒数
Toast.makeText(ShakeActivity.this, "摇动", Toast.LENGTH_SHORT)
.show();
/*
* 添加其他处理过程...
*/
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
}