How to refresh app upon shaking the device?

前端 未结 16 1972
眼角桃花
眼角桃花 2020-11-22 13:42

I need to add a shake feature that will refresh my Android application.

All I find of documentation involves implementing the SensorListener, but Eclips

16条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 14:13

    Here is my code for shake gesture detection:

    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    
    
    /**
     * Listener that detects shake gesture.
     */
    public class ShakeEventListener implements SensorEventListener {
    
    
      /** Minimum movement force to consider. */
      private static final int MIN_FORCE = 10;
    
      /**
       * Minimum times in a shake gesture that the direction of movement needs to
       * change.
       */
      private static final int MIN_DIRECTION_CHANGE = 3;
    
      /** Maximum pause between movements. */
      private static final int MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE = 200;
    
      /** Maximum allowed time for shake gesture. */
      private static final int MAX_TOTAL_DURATION_OF_SHAKE = 400;
    
      /** Time when the gesture started. */
      private long mFirstDirectionChangeTime = 0;
    
      /** Time when the last movement started. */
      private long mLastDirectionChangeTime;
    
      /** How many movements are considered so far. */
      private int mDirectionChangeCount = 0;
    
      /** The last x position. */
      private float lastX = 0;
    
      /** The last y position. */
      private float lastY = 0;
    
      /** The last z position. */
      private float lastZ = 0;
    
      /** OnShakeListener that is called when shake is detected. */
      private OnShakeListener mShakeListener;
    
      /**
       * Interface for shake gesture.
       */
      public interface OnShakeListener {
    
        /**
         * Called when shake gesture is detected.
         */
        void onShake();
      }
    
      public void setOnShakeListener(OnShakeListener listener) {
        mShakeListener = listener;
      }
    
      @Override
      public void onSensorChanged(SensorEvent se) {
        // get sensor data
        float x = se.values[SensorManager.DATA_X];
        float y = se.values[SensorManager.DATA_Y];
        float z = se.values[SensorManager.DATA_Z];
    
        // calculate movement
        float totalMovement = Math.abs(x + y + z - lastX - lastY - lastZ);
    
        if (totalMovement > MIN_FORCE) {
    
          // get time
          long now = System.currentTimeMillis();
    
          // store first movement time
          if (mFirstDirectionChangeTime == 0) {
            mFirstDirectionChangeTime = now;
            mLastDirectionChangeTime = now;
          }
    
          // check if the last movement was not long ago
          long lastChangeWasAgo = now - mLastDirectionChangeTime;
          if (lastChangeWasAgo < MAX_PAUSE_BETHWEEN_DIRECTION_CHANGE) {
    
            // store movement data
            mLastDirectionChangeTime = now;
            mDirectionChangeCount++;
    
            // store last sensor data 
            lastX = x;
            lastY = y;
            lastZ = z;
    
            // check how many movements are so far
            if (mDirectionChangeCount >= MIN_DIRECTION_CHANGE) {
    
              // check total duration
              long totalDuration = now - mFirstDirectionChangeTime;
              if (totalDuration < MAX_TOTAL_DURATION_OF_SHAKE) {
                mShakeListener.onShake();
                resetShakeParameters();
              }
            }
    
          } else {
            resetShakeParameters();
          }
        }
      }
    
      /**
       * Resets the shake parameters to their default values.
       */
      private void resetShakeParameters() {
        mFirstDirectionChangeTime = 0;
        mDirectionChangeCount = 0;
        mLastDirectionChangeTime = 0;
        lastX = 0;
        lastY = 0;
        lastZ = 0;
      }
    
      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }
    
    }
    

    Add this in your activity:

      private SensorManager mSensorManager;
    
      private ShakeEventListener mSensorListener;
    

    ...

    in onCreate() add:

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensorListener = new ShakeEventListener();   
    
        mSensorListener.setOnShakeListener(new ShakeEventListener.OnShakeListener() {
    
          public void onShake() {
            Toast.makeText(KPBActivityImpl.this, "Shake!", Toast.LENGTH_SHORT).show();
          }
        });
    

    and:

    @Override
      protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(mSensorListener,
            mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_UI);
      }
    
      @Override
      protected void onPause() {
        mSensorManager.unregisterListener(mSensorListener);
        super.onPause();
      }
    

提交回复
热议问题