How to refresh app upon shaking the device?

前端 未结 16 2047
眼角桃花
眼角桃花 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:15

    Here is another code for this:

    import java.util.List;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Handler;
    
       public class AccelerometerListener implements SensorEventListener {
    
            private SensorManager sensorManager;
            private List sensors;
            private Sensor sensor;
            private long lastUpdate = -1;
            private long currentTime = -1;
            private Main parent;
            private Timer timer;
            private int shakes;
            private static final Handler mHandler = new Handler();
    
            private float last_x, last_y, last_z;
            private float current_x, current_y, current_z, currenForce;
            private static final int FORCE_THRESHOLD = 500;
            private final int DATA_X = SensorManager.DATA_X;
            private final int DATA_Y = SensorManager.DATA_Y;
            private final int DATA_Z = SensorManager.DATA_Z;
    
            public AccelerometerListener(Main parent) {
                SensorManager sensorService = (SensorManager) parent
                        .getSystemService(Context.SENSOR_SERVICE);
    
                this.sensorManager = sensorService;
                if (sensorService == null)
                    return;
    
                this.sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
                if (sensors.size() > 0) {
                    sensor = sensors.get(0);
                }
    
                this.parent = parent;
            }
    
            public void start() {
                if (sensor == null)
                    return;
    
                sensorManager.registerListener(this, sensor,
                        SensorManager.SENSOR_DELAY_GAME);
            }
    
            public void stop() {
                if (sensorManager == null)
                    return;
    
                sensorManager.unregisterListener(this);
            }
    
            public void onAccuracyChanged(Sensor s, int valu) {
    
            }
    
            public void onSensorChanged(SensorEvent event) {
    
                if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
                    return;
    
                currentTime = System.currentTimeMillis();
    
                if ((currentTime - lastUpdate) > 50) {
                    long diffTime = (currentTime - lastUpdate);
                    lastUpdate = currentTime;
    
                    current_x = event.values[DATA_X];
                    current_y = event.values[DATA_Y];
                    current_z = event.values[DATA_Z];
    
                    currenForce = Math.abs(current_x + current_y + current_z - last_x
                            - last_y - last_z)
                            / diffTime * 10000;
    
                    if (currenForce > FORCE_THRESHOLD) {
                        shakeDetected();
                    }
                    last_x = current_x;
                    last_y = current_y;
                    last_z = current_z;
    
                }
            }
    
            private void shakeDetected() {
                shakes++;
    
                if (shakes == 1) {
                    if (timer != null) {
                        timer.cancel();
                    }
    
                    timer = new Timer();
                    timer.schedule(new TimerTask() {
    
                        @Override
                        public void run() {
                            if (shakes > 3) {
                                mHandler.post(new Runnable() {
    
                                    public void run() {
                                        // shake
                                    }
                                });
                            }
    
                            shakes = 0;
                        }
                    }, 500);
                }
            }
        }
    

提交回复
热议问题