LibGDX-检查指南针是否需要校准

时间:2019-12-03 09:52:51

标签: libgdx compass-geolocation calibration

如何检查LibGDX(在Android上)指南针是否已正确校准。我已经找到了在本地Android上的方法:

In Android can I programmatically detect that the compass is not yet calibrated?

但是找不到LibGDX中是否实现了该功能。

1 个答案:

答案 0 :(得分:0)

您想要的内容在Wiki文章Interfacing with platform specific code中进行了描述。 LibGDX没有任何功能,因为它不常见,并且对其他后端也没有任何意义。

core模块中,您将看到以下内容:

public interface GameListener {
    void calibrateCompassIfNeeded()
}

public class Application extends ApplicationAdapter {

    private GameListener listener;    

    public Application(GameListener listener) {
        this.listener = listener;
    }

    @Override
    public void create() {
        // Call listener.calibrateCompassIfNeeded() whenever needed.
    }

    public void onCompassChanged(float[] values) {
        // Do something...
    }
}

android模块中:

public class AndroidLauncher extends AndroidApplication implements GameListener, SensorEventListener {
    private static final int COMPASS_ACCURACY_UNKNOWN = -1;

    private Application app;
    private int compassAccuracy = COMPASS_ACCURACY_UNKNOWN;

    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);

        SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor compassSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        sensorManager.registerListener(this, compassSensor, SensorManager.SENSOR_DELAY_GAME)

        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        app = new Application(this);
        initialize(app, config);
    }

    @Override
    public void calibrateCompassIfNeeded() {
        if (compassAccuracy != COMPASS_ACCURACY_UNKNOWN && compassAccuracy < SENSOR_STATUS_ACCURACY_MEDIUM) {
            // Calibrate only if accuracy is below medium.
            // Show whatever is needed so user calibrates the compass.
        }
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
            app.onCompassChanged(event.values);
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
       compassAccuracy = accuracy;
    }
}

我还没有尝试过,而且以前从未使用过指南针,但是我很确定这可以正常工作。