您可以使用CMMotionManager
的加速度计数据来检测步进事件。
protected CMMotionManager _motionManager;
public event EventHandler<bool> OnMotion;
public double ACCEL_DETECTION_LIMIT = 0.31;
private const double ACCEL_REDUCE_SPEED = 0.9;
private double accel = -1;
private double accelCurrent = 0;
private void StartAccelerometerUpdates()
{
if (_motionManager.AccelerometerAvailable)
_motionManager.AccelerometerUpdateInterval = ACCEL_UPDATE_INTERVAL;
_motionManager.StartAccelerometerUpdates (NSOperationQueue.MainQueue, AccelerometerDataUpdatedHandler);
}
public void AccelerometerDataUpdatedHandler(CMAccelerometerData data, NSError error)
{
double x = data.Acceleration.X;
double y = data.Acceleration.Y;
double z = data.Acceleration.Z;
double accelLast = accelCurrent;
accelCurrent = Math.Sqrt(x * x + y * y + z * z);
double delta = accelCurrent - accelLast;
accel = accel * ACCEL_REDUCE_SPEED + delta;
var didStep = OnMotion;
if (accel > ACCEL_DETECTION_LIMIT)
{
didStep (this, true);//maked a step
} else {
didStep (this, false);
}
}
float g = (x * x + y * y + z * z) / (GRAVITY_VALUE * GRAVITY_VALUE)
g=1
(当你静止时会看到这个值)。该值中的峰表示步数。所以你只需要数峰即可。请注意,简单的g>1不行,因为对于一步来说,g值会在一定时间内增加,然后回落(如果你将值随时间的变化绘制出来,应该像正弦波一样,当有一步时,你想要计数正弦波)。
private double accel
设置为-1即可。 - Kuchur Andrei