在安卓设备上检测左右晃动?

14

我希望使用SensorManager来检测设备左右摇晃,但是我不知道如何检测设备的摇晃方向是向左还是向右。我的问题如下:

  • 如何使用SensorManager实现设备的摇晃?

  • 如何检测设备摇晃的方向?

2个回答

21

我尝试了这个方法并发现了一种实现方式。这种方法是,我监测X轴的值。如果阈值超过限制并且X值超过我们给定的值,那么我们会收到一个Toast消息,告诉我们我们是向左还是向右摇晃手机。我的尝试如下:

public class ShakeActivity extends Activity implements SensorListener {
        // For shake motion detection.
        private SensorManager sensorMgr;
        private long lastUpdate = -1;
        private float x, y, z;
        private float last_x, last_y, last_z;
        private static final int SHAKE_THRESHOLD = 800;

        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        // start motion detection
        sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
        boolean accelSupported = sensorMgr.registerListener(this,
            SensorManager.SENSOR_ACCELEROMETER,
            SensorManager.SENSOR_DELAY_GAME);

        if (!accelSupported) {
            // on accelerometer on this device
            sensorMgr.unregisterListener(this,
                    SensorManager.SENSOR_ACCELEROMETER);
        }
        }

        protected void onPause() {
        if (sensorMgr != null) {
            sensorMgr.unregisterListener(this,
                    SensorManager.SENSOR_ACCELEROMETER);
            sensorMgr = null;
            }
        super.onPause();
        }

        public void onAccuracyChanged(int arg0, int arg1) {
        // TODO Auto-generated method stub
        }

        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];

            if(Round(x,4)>10.0000){
                Log.d("sensor", "X Right axis: " + x);
                Toast.makeText(this, "Right shake detected", Toast.LENGTH_SHORT).show();
            }
            else if(Round(x,4)<-10.0000){
                Log.d("sensor", "X Left axis: " + x);
                Toast.makeText(this, "Left shake detected", Toast.LENGTH_SHORT).show();
            }

            float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;

            // Log.d("sensor", "diff: " + diffTime + " - speed: " + speed);
            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;
            }
        }
        }

        public static float Round(float Rval, int Rpl) {
        float p = (float)Math.pow(10,Rpl);
        Rval = Rval * p;
        float tmp = Math.round(Rval);
        return (float)tmp/p;
        }
    }

3

这个问题已经被问过(并解决)在这里


2
@ Gabriel Neguţ: 但是我正在问如何检测摇晃的方向。它没有回答这个问题。 - Nikki
您可以将这些示例任何一个适应成仅检查X轴运动。 - Gabriel Negut
@ Gabriel Neguţ:SensorManager.DATA_X 是否提供左侧(负数)和右侧(正数)的 x 坐标? - Nikki
根据官方文档,是的。 - Gabriel Negut
你知道如何检测从上到下的移动,就像猛击设备一样吗? - Skizo-ozᴉʞS ツ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接