2011-06-05 160 views
0

我从网站http://www.clingmarks.com/?p=25得到了这段代码,我想要一些帮助!Android移动传感器帮助

此代码记录手机的晃动。它只允许每100毫秒更新一次,抖动值必须超过800,SHAKE_THRESHOLD。

我有问题是,如果手机检测到的抖动,(然后变量i ++)我想没有能够达到的代码块,在一定时间经过之前。

有人可以帮助我吗?

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

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ...... // other initializations 
      // 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]; 

       float speed = Math.abs(x+y+z - last_x - last_y - last_z) 
        /diffTime * 10000; 
       if (speed > SHAKE_THRESHOLD) { 
        // yes, this is a shake action! Do something about it! 
        i++; 
       } 
       last_x = x; 
       last_y = y; 
       last_z = z; 
      } 
     } 
    } 
} 

回答

1

你想要的行为被称为“释放”。你想设置某个变量的活动对象:

private long last_shake_time = 0; 

,然后检查和更新,在注册表的抖动代码:

  if (speed > SHAKE_THRESHOLD) { 
       // yes, this is a shake action! 
       long shake_time = System.currentTimeMillis(); 
       if (shake_time - last_shake_time >= SHAKE_HOLDOFF_MS) { 
        i++; 
        last_shake_time = shake_time; 
       } 
      } 

随着SHAKE_HOLDOFF_MS定义就像SHAKE_THRESHOLD常数:

private static final long SHAKE_HOLDOFF_MS = 5000; 
1

设置您注册摇一摇的时间的变量,System.currentTimeMillis()。然后当你再次摇一摇,比较当前时间和最后一次摇动时间。如果超过所需的延迟时间,请注册新的摇动并更新最后的摇动时间。否则,不要做任何事情。