2011-08-08 5 views
0

背後に使用されているこれは、私が電話の揺れをキャプチャするために使用していたコードです:がどのようなロジック、この加速度センサーリスナー

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

私は何をしたいのか、それは持ち上げに応答するように、ハンドシェイクを真似ていますあなたが横のスクリーンに直面しているかのようにそれを上下に動かしているときに電話を上下に動かす。

このコードは、長さ軸を中心に電話を回すように電話機をねじることに反します。

このコードで使用されている座標x、y、zの背後にある論理を説明する人がいますか?携帯電話の場所の点でこれらはどこですか?そして、手でそれをねじるのではなく "ハンドシェイク" 。

このようなコードのアイデアですか?

答えて

0

アクティビティクラス

/* 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(); 
} 

でこれを追加し、あなたの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; 

関連する問題