void ISensorEventListener.OnSensorChanged(SensorEvent e) { if (e.Sensor.Name == accelerometer && !lastAccelerometerSet) { e.Values.CopyTo(lastAccelerometer, 0); lastAccelerometerSet = true; } else if (e.Sensor.Name == magnetometer && !lastMagnetometerSet) { e.Values.CopyTo(lastMagnetometer, 0); lastMagnetometerSet = true; } if (lastAccelerometerSet && lastMagnetometerSet) { SensorManager.GetRotationMatrix(r, null, lastAccelerometer, lastMagnetometer); SensorManager.GetOrientation(r, orientation); if (orientation.Length <= 0) { return; } var azimuthInRadians = orientation[0]; if (applyLowPassFilter) { filter.Add(azimuthInRadians); azimuthInRadians = filter.Average(); } var azimuthInDegress = (Java.Lang.Math.ToDegrees(azimuthInRadians) + 360.0) % 360.0; var data = new CompassData(azimuthInDegress); Compass.OnChanged(data); lastMagnetometerSet = false; lastAccelerometerSet = false; } }