2012-04-24 119 views
15

嗨,我正在构建Android的3D游戏。什么是安卓方向传感器的替代方案?

我目前正在尝试将传感器添加到我的游戏中,以允许玩家将android作为其控件倾斜。

理想情况下,我想使用ORIENTATION传感器,但我注意到它已被弃用。有谁知道如何在android中检测倾斜并不使用此传感器?

回答

41

没有实际的“定位”传感器 - 这实际上是一个复合传感器,由加速度计和放大器组合而成。

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

“这种传感器类型存在遗留的原因,请结合使用getRotationMatrix()remapCoordinateSystem()与和getOrientation()来计算这些值而不是”。

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

是否有无论如何使用getOrientation()命令像事件处理程序一样如何使用其他传感器? – user1207381 2012-04-24 05:02:32

+4

getOrientation()函数需要getRotationMatrix()中的值 - 这需要来自磁性传感器和加速度传感器的值。因此,您为这两个传感器设置传感器侦听器并缓存您为其获取的值。然后,您可以在获取任一传感器的新数据时重新计算方向。 – JesusFreke 2012-04-24 05:24:15

+0

他们是如何将这些方法一起使用的示例代码?我一直无法找到这些方法的任何使用。 – user1207381 2012-04-26 23:50:27