Android搖一搖功能實現(搖一搖監聽)

近期項目中要求增加搖一搖功能,搜了相關帖子,自己整理一套代碼,發個博客保留一份。

解析:Android中搖一搖主要通過[SensorManager]實現,想了解可以查一下。

public class ShakeHelper implements SensorEventListener {
  private Context mContext;
  //傳感器管理器
  private SensorManager mSensorManager;
  //傳感器
  private Sensor mSensor;
  //速度閥值
  private int mSpeed = 3000;
  //時間間隔
  private int mInterval = 150;
  //上一次搖晃的時間
  private long LastTime;
  //上一次的x、y、z座標
  private float LastX, LastY, LastZ;

  private boolean flag = true;
  private Handler handler = new Handler();

  public ShakeHelper(Context mContext) {
    this.mContext = mContext;
    Start();
  }

  public void Start() {

    mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
    if (mSensorManager != null) {
      mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    }
    if (mSensor != null) {
      mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
    }

  }

  public void Stop() {
    mSensorManager.unregisterListener(this);
    handler.removeCallbacksAndMessages(null);
  }

  @Override
  public void onAccuracyChanged(Sensor arg0, int arg1) {
  }

  @Override
  public void onSensorChanged(SensorEvent Event) {
    long NowTime = System.currentTimeMillis();
    if ((NowTime - LastTime) < mInterval) {
      return;
    }
    //將NowTime賦給LastTime
    LastTime = NowTime;
    //獲取x,y,z
    float NowX = Event.values[0];
    float NowY = Event.values[1];
    float NowZ = Event.values[2];
    //計算x,y,z變化量
    float DeltaX = NowX - LastX;
    float DeltaY = NowY - LastY;
    float DeltaZ = NowZ - LastZ;
    //賦值
    LastX = NowX;
    LastY = NowY;
    LastZ = NowZ;
    //計算
    double NowSpeed = Math.sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ * DeltaZ) / mInterval * 10000;
    //判斷
    if (NowSpeed >= mSpeed) {
      
      if (flag) {
        /**
         * 相應操作
         */
        flag = false;
            
        //搖一搖執行3s後通知外部
        handler.postDelayed(new Runnable() {
          @Override
          public void run() {
            if (startListener != null) {
              startListener.onStart();
            }
          }
        }, mSpeed);

      }

      //防止3s內重複搖一搖,去執行相應操作
      handler.postDelayed(new Runnable() {
        @Override
        public void run() {
          flag = true;
        }
      }, mSpeed);

    }
  }

  //接口回調,搖一搖開始通知外部
  public interface onStartListener {
    void onStart();
  }

  public onStartListener startListener;

  public void setStartListener(onStartListener startListener) {
    this.startListener = startListener;
  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章