2011-08-08 4 views
0

C'est le code que je utilise pour capturer la secousse du téléphone:Quelle logique est utilisé derrière ce capteur accéléromètre auditeur

public void onSensorChanged(SensorEvent event) { 
     Sensor mySensor = event.sensor; 
     if (mySensor.getType() == SensorManager.SENSOR_ACCELEROMETER) { 
      long curTime = System.currentTimeMillis(); 
      // only allow one update every 100ms. 
      if ((curTime - lastUpdate) > 100) { 
       long diffTime = (curTime - lastUpdate); 
       lastUpdate = curTime; 

       x = event.values[SensorManager.DATA_X]; 
       y = event.values[SensorManager.DATA_Y]; 
       z = event.values[SensorManager.DATA_Z]; 

       float speed = Math.abs(x+y+z - last_x - last_y - last_z)/ diffTime * 10000; 
       if (speed > SHAKE_THRESHOLD_HIGH) { 
        // yes, this is a shake action! Do something about it! 
        handshake_score.setText(String.valueOf(speed)); 
        new AlertDialog.Builder(Handshake.this) 
        .setCancelable(true) 
        .setIcon(android.R.drawable.ic_dialog_info) 
        .setTitle("noo") 
        .setMessage("too much") 
        .setPositiveButton("OK!", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
           dialog.cancel(); 
          } 
         }) 
        .show(); 

        last_x = x; 
        last_y = y; 
        last_z = z; 

       } else if (speed > SHAKE_THRESHOLD_PASS) { 
        // yes, this is a shake action! Do something about it! 
        handshake_score.setText(String.valueOf(speed)); 
        sensorMgr.unregisterListener(this); 
        new AlertDialog.Builder(Handshake.this) 
        .setCancelable(true) 
        .setIcon(android.R.drawable.ic_dialog_info) 
        .setTitle("HAHAA!") 
        .setMessage("good") 
        .setPositiveButton("OK!", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
           dialog.cancel(); 
          } 
         }) 
        .show(); 

        finish(); 

       } else if (speed > SHAKE_THRESHOLD_SMALL) { 
        // yes, this is a shake action! Do something about it! 
        handshake_score.setText(String.valueOf(speed)); 
        new AlertDialog.Builder(Handshake.this) 
        .setCancelable(true) 
        .setIcon(android.R.drawable.ic_dialog_info) 
        .setTitle("boo") 
        .setMessage("not enough") 
        .setPositiveButton("OK!", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
           dialog.cancel(); 
          } 
         }) 
        .show(); 

        last_x = x; 
        last_y = y; 
        last_z = z; 
       } 
       last_x = x; 
       last_y = y; 
       last_z = z; 
      } 
     }   
    } 

Ce que je veux faire est d'imiter une poignée de main de sorte qu'il répondrait à la levée de la téléphone de haut en bas lorsque vous le tenez horizontalement comme si vous êtes face à l'écran de paysage et de le déplacer de haut en bas.

Alors que ce code résout de tordre le téléphone comme si vous tournez le téléphone autour de son axe de longueur. Est-ce que quelqu'un peut expliquer les logiques derrière les coordonnées x, y et z utilisées dans ce code, où sont-elles en termes de place dans le téléphone et comment je pourrais avoir le phoen répondant aux "poignées de mains" plutôt que de le tordre dans la main .

des idées pour un tel code?

Répondre

0

ajouter dans votre classe d'activité

/* put this into your activity class */ 
private SensorManager mSensorManager; 
private float mAccel; // acceleration apart from gravity 
private float mAccelCurrent; // current acceleration including gravity 
private float mAccelLast; // last acceleration including gravity 

private final SensorEventListener mSensorListener = new SensorEventListener() { 

public void onSensorChanged(SensorEvent se) { 
    float x = se.values[0]; 
    float y = se.values[1]; 
    float z = se.values[2]; 
    mAccelLast = mAccelCurrent; 
    mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z)); 
    float delta = mAccelCurrent - mAccelLast; 
    mAccel = mAccel * 0.9f + delta; // perform low-cut filter 
} 

public void onAccuracyChanged(Sensor sensor, int accuracy) { 
} 
}; 

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

@Override 
protected void onStop() { 
mSensorManager.unregisterListener(mSensorListener); 
super.onStop(); 
} 

Et ajoutez ceci à votre méthode onCreate:

mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 
mAccel = 0.00f; 
mAccelCurrent = SensorManager.GRAVITY_EARTH; 
mAccelLast = SensorManager.GRAVITY_EARTH; 

J'espère que cela aidera

Questions connexes