15
嗨,我正在构建Android的3D游戏。什么是安卓方向传感器的替代方案?
我目前正在尝试将传感器添加到我的游戏中,以允许玩家将android作为其控件倾斜。
理想情况下,我想使用ORIENTATION传感器,但我注意到它已被弃用。有谁知道如何在android中检测倾斜并不使用此传感器?
嗨,我正在构建Android的3D游戏。什么是安卓方向传感器的替代方案?
我目前正在尝试将传感器添加到我的游戏中,以允许玩家将android作为其控件倾斜。
理想情况下,我想使用ORIENTATION传感器,但我注意到它已被弃用。有谁知道如何在android中检测倾斜并不使用此传感器?
没有实际的“定位”传感器 - 这实际上是一个复合传感器,由加速度计和放大器组合而成。
从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]));
}
}
}
是否有无论如何使用getOrientation()命令像事件处理程序一样如何使用其他传感器? – user1207381 2012-04-24 05:02:32
getOrientation()函数需要getRotationMatrix()中的值 - 这需要来自磁性传感器和加速度传感器的值。因此,您为这两个传感器设置传感器侦听器并缓存您为其获取的值。然后,您可以在获取任一传感器的新数据时重新计算方向。 – JesusFreke 2012-04-24 05:24:15
他们是如何将这些方法一起使用的示例代码?我一直无法找到这些方法的任何使用。 – user1207381 2012-04-26 23:50:27