【问题标题】:What is the alternative to android orientation sensor?android方向传感器的替代品是什么?
【发布时间】:2012-04-24 03:20:29
【问题描述】:

您好,我正在为 Android 开发一款 3D 游戏。

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

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

【问题讨论】:

    标签: android events android-sensors


    【解决方案1】:

    没有实际的“方向”传感器 - 这实际上是(曾经)一个复合传感器,由加速度计和磁力计的组合生成。

    来自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() 命令,就像使用其他传感器一样?
    • getOrientation() 函数需要来自 getRotationMatrix() 的值 - 这需要来自磁传感器和加速度传感器的值。因此,您为这 2 个传感器设置传感器侦听器并缓存您为它们获取的值。然后,当您获得任一传感器的新数据时,您可以重新计算方向。
    • 他们的示例代码是如何一起使用这些方法的吗?我还没有找到这些方法的任何用途。
    • 这些都是很好的建议,我尝试了类似的方法。问题是我得到的值看起来像角度,但跳来跳去有点不一致。我想知道您在使用此传感器时是否经历过类似的事情?
    • 加速度计和磁力计传感器的噪音往往很大。您可以尝试使用运行平均值来帮助平滑它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 2018-08-31
    • 2010-10-01
    • 2014-04-20
    • 2019-02-22
    • 2011-05-07
    相关资源
    最近更新 更多