久病成欢 发表于 2016-4-8 10:53

Android加速度传感器实现“摇一摇”,带手机振动

本帖最后由 久病成欢 于 2016-4-8 10:54 编辑

  Activity
   view plain copypackage 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
   view plain copy/**

  * 一个检测手机摇晃的监听器

  * 加速度传感器

  * values: x-axis 方向加速度

  * values: y-axis 方向加速度

  * values: 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;

  float y = event.values;

  float z = event.values;

  // 获得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();

  }

  }

转自:http://blog.csdn.net/onlyonecoder/article/details/8477072
页: [1]
查看完整版本: Android加速度传感器实现“摇一摇”,带手机振动