Android加速度传感器实现“摇一摇”,带手机振动
Activity
- package com.lmw.android.test;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Vibrator;
- import android.view.View;
- import android.widget.Toast;
- import com.lmw.android.test.ShakeListener.OnShakeListener;
- public class ShakeActivity extends Activity {
- ShakeListener mShakeListener = null;
- Vibrator mVibrator;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.shake);
- // drawerSet ();//设置 drawer监听 切换 按钮的方向
- //获得振动器服务
- mVibrator = (Vibrator) getApplication().getSystemService(VIBRATOR_SERVICE);
- //实例化加速度传感器检测类
- mShakeListener = new ShakeListener(ShakeActivity.this);
- mShakeListener.setOnShakeListener(new OnShakeListener() {
- public void onShake() {
- mShakeListener.stop();
- startVibrato(); // 开始 震动
- new Handler().postDelayed(new Runnable() {
- @Override
- public void run() {
- Toast mtoast;
- mtoast = Toast.makeText(ShakeActivity.this,
- "呵呵,成功了!。\n再试一次吧!", 1000);
- mtoast.show();
- mVibrator.cancel();
- mShakeListener.start();
- }
- }, 2000);
- }
- });
- }
- // 定义震动
- public void startVibrato() {
- mVibrator.vibrate(new long[] { 500, 200, 500, 200 }, -1);
- // 第一个{}里面是节奏数组,
- // 第二个参数是重复次数,-1为不重复,非-1则从pattern的指定下标开始重复
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- if (mShakeListener != null) {
- mShakeListener.stop();
- }
- }
- }
ShakeListener
- /**
- * 一个检测手机摇晃的监听器
- * 加速度传感器
- * values[0]: x-axis 方向加速度
- * values[1]: y-axis 方向加速度
- * values[2]: z-axis 方向加速度
- */
- public class ShakeListener implements SensorEventListener {
- // 速度的阈值,当摇晃速度达到这值后产生作用
- private static final int SPEED_SHRESHOLD = 3000;
- // 两次检测的时间间隔
- private static final int UPTATE_INTERVAL_TIME = 70;
- // 传感器管理器
- private SensorManager sensorManager;
- // 传感器
- private Sensor sensor;
- // 重力感应监听器
- private OnShakeListener onShakeListener;
- // 上下文
- private Context mContext;
- // 手机上一个位置时重力感应坐标
- private float lastX;
- private float lastY;
- private float lastZ;
- // 上次检测时间
- private long lastUpdateTime;
- // 构造器
- public ShakeListener(Context c) {
- // 获得监听对象
- mContext = c;
- start();
- }
- // 开始
- public void start() {
- // 获得传感器管理器
- sensorManager = (SensorManager) mContext
- .getSystemService(Context.SENSOR_SERVICE);
- if (sensorManager != null) {
- // 获得重力传感器
- sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
- }
- // 注册
- if (sensor != null) {
- //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,
- //根据不同应用,需要的反应速率不同,具体根据实际情况设定
- sensorManager.registerListener(this, sensor,SensorManager.SENSOR_DELAY_NORMAL);
- }
- }
- // 停止检测
- public void stop() {
- sensorManager.unregisterListener(this);
- }
- // 设置重力感应监听器
- 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) {
- }
- // 摇晃监听接口
- public interface OnShakeListener {
- public void onShake();
- }
- }