2012-04-24 16 views
15

Hola, estoy construyendo un juego en 3D para Android.¿Cuál es la alternativa al sensor de orientación de Android?

Actualmente estoy tratando de agregar un sensor a mi juego que permite al jugador inclinar el android como sus controles.

Idealmente, me gustaría utilizar el sensor ORIENTATION, pero me di cuenta de que ha quedado obsoleto. ¿Alguien sabe cómo detectar la inclinación en el Android y no usa este sensor?

Respuesta

41

No hay un sensor de "orientación" real; este es (era) en realidad un sensor compuesto, generado a partir de una combinación del acelerómetro y el magnómetro.

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

"existe este tipo de sensor por razones de compatibilidad, por favor utilice getRotationMatrix() conjuntamente con remapCoordinateSystem() y getOrientation() para calcular estos valores en su lugar."

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

¿Hay alguna forma de utilizar el comando getOrientation() como un controlador de eventos como el uso de los otros sensores? – user1207381

+4

la función getOrientation() requiere los valores de getRotationMatrix() - que requiere los valores de los sensores magnéticos y del acelerómetro. Entonces configura el detector de sensor para esos 2 sensores y guarda en caché los valores que obtiene para ellos. Y luego puede recalcular la orientación cuando obtiene nuevos datos para cualquiera de los sensores. – JesusFreke

+0

¿Su código de muestra de cómo se usan estos métodos juntos? No he podido encontrar ningún uso de estos métodos juntos. – user1207381

Cuestiones relacionadas