2012-04-24 13 views
15

Ciao sto costruendo un gioco 3D per Android.Qual è l'alternativa al sensore di orientamento Android?

Attualmente sto cercando di aggiungere un sensore al mio gioco che permetta al giocatore di inclinare l'androide come i suoi controlli.

Idealmente mi piacerebbe utilizzare il sensore ORIENTAMENTO, ma ho notato che è stato deprecato. Qualcuno sa come rilevare l'inclinazione in Android e non usa questo sensore?

risposta

41

Non esiste un vero sensore di "orientamento": questo è (era) in realtà un sensore composito, generato da una combinazione dell'accelerometro e del magnometro.

Da http://developer.android.com/reference/android/hardware/SensorEvent.html

"Questo tipo di sensore esiste per motivi di eredità, utilizzare getRotationMatrix() unitamente remapCoordinateSystem() e getOrientation() per calcolare questi valori invece."

public class OrientationTestActivity extends Activity implements SensorEventListener 
{ 
    private SensorManager mSensorManager; 
    private Sensor mAccelerometer; 
    private Sensor mMagnetometer; 

    private float[] mLastAccelerometer = new float[3]; 
    private float[] mLastMagnetometer = new float[3]; 
    private boolean mLastAccelerometerSet = false; 
    private boolean mLastMagnetometerSet = false; 

    private float[] mR = new float[9]; 
    private float[] mOrientation = new float[3]; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    } 

    protected void onResume() { 
     super.onResume(); 
     mLastAccelerometerSet = false; 
     mLastMagnetometerSet = false; 
     mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    protected void onPause() { 
     super.onPause(); 
     mSensorManager.unregisterListener(this); 
    } 

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

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (event.sensor == mAccelerometer) { 
      System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length); 
      mLastAccelerometerSet = true; 
     } else if (event.sensor == mMagnetometer) { 
      System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length); 
      mLastMagnetometerSet = true; 
     } 
     if (mLastAccelerometerSet && mLastMagnetometerSet) { 
      SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer); 
      SensorManager.getOrientation(mR, mOrientation); 
      Log.i("OrientationTestActivity", String.format("Orientation: %f, %f, %f", 
                  mOrientation[0], mOrientation[1], mOrientation[2])); 
     } 
    } 
} 
+0

Esiste comunque l'utilizzo del comando getOrientation() come un gestore di eventi come vengono utilizzati gli altri sensori? – user1207381

+4

la funzione getOrientation() richiede i valori di getRotationMatrix(), che richiede i valori di entrambi i sensori magnetico e accelerometro. Quindi imposta l'ascoltatore del sensore per quei 2 sensori e memorizza nella cache i valori che ottieni per loro. E poi puoi ricalcolare l'orientamento quando ottieni nuovi dati per entrambi i sensori. – JesusFreke

+0

Il loro codice di esempio per come questi metodi vengono utilizzati insieme? Non sono stato in grado di trovare alcun uso di questi metodi insieme. – user1207381

Problemi correlati