/* The following code was written by Matthew Wiggins * and is released under the APACHE 2.0 license * * http://www.apache.org/licenses/LICENSE-2.0 */package com.hlidskialf.android.hardware;import android.hardware.SensorListener;import android.hardware.SensorManager;import android.content.Context;import java.lang.UnsupportedOperationException;public class ShakeListener implements SensorListener {  private static final int FORCE_THRESHOLD = 350;  private static final int TIME_THRESHOLD = 100;  private static final int SHAKE_TIMEOUT = 500;  private static final int SHAKE_DURATION = 1000;  private static final int SHAKE_COUNT = 3;  private SensorManager mSensorMgr;  private float mLastX=-1.0f, mLastY=-1.0f, mLastZ=-1.0f;  private long mLastTime;  private OnShakeListener mShakeListener;  private Context mContext;  private int mShakeCount = 0;  private long mLastShake;  private long mLastForce;  public interface OnShakeListener  {    public void onShake();  }  public ShakeListener(Context context)   {     mContext = context;    resume();  }  public void setOnShakeListener(OnShakeListener listener)  {    mShakeListener = listener;  }  public void resume() {    mSensorMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);    if (mSensorMgr == null) {      throw new UnsupportedOperationException("Sensors not supported");    }    boolean supported = mSensorMgr.registerListener(this, SensorManager.SENSOR_ACCELEROMETER, SensorManager.SENSOR_DELAY_GAME);    if (!supported) {      mSensorMgr.unregisterListener(this, SensorManager.SENSOR_ACCELEROMETER);      throw new UnsupportedOperationException("Accelerometer not supported");    }  }  public void pause() {    if (mSensorMgr != null) {      mSensorMgr.unregisterListener(this, SensorManager.SENSOR_ACCELEROMETER);      mSensorMgr = null;    }  }  public void onAccuracyChanged(int sensor, int accuracy) { }  public void onSensorChanged(int sensor, float[] values)   {    if (sensor != SensorManager.SENSOR_ACCELEROMETER) return;    long now = System.currentTimeMillis();    if ((now - mLastForce) > SHAKE_TIMEOUT) {      mShakeCount = 0;    }    if ((now - mLastTime) > TIME_THRESHOLD) {      long diff = now - mLastTime;      float speed = Math.abs(values[SensorManager.DATA_X] + values[SensorManager.DATA_Y] + values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) / diff * 10000;      if (speed > FORCE_THRESHOLD) {        if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION)) {          mLastShake = now;          mShakeCount = 0;          if (mShakeListener != null) {             mShakeListener.onShake();           }        }        mLastForce = now;      }      mLastTime = now;      mLastX = values[SensorManager.DATA_X];      mLastY = values[SensorManager.DATA_Y];      mLastZ = values[SensorManager.DATA_Z];    }  }}

public class ShakeListenerTestActivity extends Activity{  private ShakeListener mShaker;  @Override  public void onCreate(Bundle savedInstanceState)  {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    final Vibrator vibe = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);    mShaker = new ShakeListener(this);    mShaker.setOnShakeListener(new ShakeListener.OnShakeListener () {      public void onShake()      {        vibe.vibrate(100);        new AlertDialog.Builder(Testy.this)          .setPositiveButton(android.R.string.ok, null)          .setMessage("Shooken!")          .show();      }    });  }  @Override  public void onResume()  {    mShaker.resume();    super.onResume();  }  @Override  public void onPause()  {    mShaker.pause();    super.onPause();  }}

public void onSensorChanged(int sensor, float[] values) {  if (sensor == SensorManager.SENSOR_ACCELEROMETER) {    long curTime = System.currentTimeMillis();    // only allow one update every 100ms.    if ((curTime - lastUpdate) > 100) {      long diffTime = (curTime - lastUpdate);      lastUpdate = curTime;      x = values[SensorManager.DATA_X];      y = values[SensorManager.DATA_Y];      z = values[SensorManager.DATA_Z];      float speed = Math.abs(x+y+z – last_x – last_y – last_z) / diffTime * 10000;      if (speed > SHAKE_THRESHOLD) {        Log.d("sensor", "shake detected w/ speed: " + speed);        Toast.makeText(this, "shake detected w/ speed: " + speed, Toast.LENGTH_SHORT).show();      }      last_x = x;      last_y = y;      last_z = z;    }  }}

更多相关文章

  1. 代码中设置drawableleft
  2. android 3.0 隐藏 系统标题栏
  3. Android开发中activity切换动画的实现
  4. Android(安卓)学习 笔记_05. 文件下载
  5. Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
  6. 技术博客汇总
  7. android 2.3 wifi (一)
  8. AndRoid Notification的清空和修改
  9. Android中的Chronometer

随机推荐

  1. Android工程中R类访问不到工程中的资源文
  2. Android(安卓)模拟器测试远程服务器成功,
  3. Android切换按钮与沉浸式状态栏的实现
  4. Android中的进程保活(不死进程)
  5. Android(安卓)Studio编译C++代码——Rele
  6. 实现Android监控任意控件或按键双击事件
  7. Android(安卓)11 功能和 API : 面向企业
  8. Android给布局设置阴影
  9. Android(安卓)TextView两端对齐
  10. 关于android安装sdk时找不到jdk的解决办