【问题标题】:Detect shaking of device in left or right direction in android?在android中检测设备向左或向右方向的抖动?
【发布时间】:2011-06-03 08:11:37
【问题描述】:

我想使用 SensorManager,但为了检测设备向左或向右的晃动,我不知道如何检测设备的晃动是向右还是向左。我有以下问题:

  • 如何使用 SensorManager 实现设备抖动?

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

【问题讨论】:

    标签: android


    【解决方案1】:

    我已经尝试过这个并找到了一种方法。方法是,我正在监控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;
            }
        }
    

    【讨论】:

      【解决方案2】:

      已被询问(并已解决)right here

      【讨论】:

      • @Gabriel Neguţ:但我在问如何检测哪个方向的晃动。它不回答这个问题
      • 您可以调整这些示例中的任何一个以仅检查 X 轴运动。
      • @Gabriel Neguţ:SensorManager.DATA_X 是否提供左(负)和右(正)的 x 坐标
      • 根据official docs,是的。
      • 你知道如何检测从上到下的运动像粉碎装置吗?
      猜你喜欢
      • 2011-10-02
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 2011-03-29
      • 2011-07-23
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多