如何使用加速度计xamarin检查设备是否在最后1分钟内移动



am正在寻找检测设备是否未移动的方法,同时使用加速度计xamarin 进行最后1分钟的检测

public double oldx,newx;
protected override void OnAppearing()
{
base.OnAppearing();
if (Accelerometer.IsMonitoring)
Accelerometer.Stop();
else
Accelerometer.Start(SensorSpeed.UI);
Accelerometer.ReadingChanged += Accelerometre_ReadingChanged;
void Accelerometre_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
oldx = e.Reading.Acceleration.X;
}
Device.StartTimer(new TimeSpan(0, 1, 0), () =>
{

Accelerometer.ReadingChanged += Accelerometre_ReadingChanged1;
void Accelerometre_ReadingChanged1(object sender, AccelerometerChangedEventArgs ee)
{
newx = ee.Reading.Acceleration.X;
}
if(oldx != newx){
// do somth......
//the problem here always oldx==newx           
}
});
}

问题是当我比较oldx和newx总是相同的值时,但我想检查移动设备cordante是否在1分钟后发生变化任何解决方案,请提前感谢。

您要做的是在视图出现时附加一个事件处理程序。然后你等一分钟,再加一个。

当加速计触发时,两个事件处理程序都将激活并写入oldxnewx,这就是为什么您会看到这两个值相同。

相反,如果我是你,我只需附加一个事件处理程序,并保存值+事件触发的时间。然后你可以在你的计时器中比较它何时触发。

这可能看起来像:

private double _lastX;
private double _lastHandledX;
private void Accelerometre_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
_lastX = e.Reading.Acceleration.X;
}
private void OnTimerTriggered()
{
if (_lastX != _lastHandledX)
{
// bingo!
}
_lastHandledX = _lastX;
}

然后像这样启动计时器:

Device.StartTimer(new TimeSpan(0, 1, 0), OnTimerTriggered);

所以你的完整列表看起来像:

private double _lastX;
private double _lastHandledX;
private void Accelerometre_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
_lastX = e.Reading.Acceleration.X;
}
private void OnTimerTriggered()
{
if (_lastX != _lastHandledX)
{
// bingo!
}
_lastHandledX = _lastX;
}
protected override void OnAppearing()
{
base.OnAppearing();
if (Accelerometer.IsMonitoring)
Accelerometer.Stop();
else
Accelerometer.Start(SensorSpeed.UI);
Accelerometer.ReadingChanged += Accelerometre_ReadingChanged;
Device.StartTimer(new TimeSpan(0, 1, 0), OnTimerTriggered);
}

您应该在第一次和一分钟后比较两个值。

private double _firstX;
private double _lastX;
private bool IsFirst;

private void Accelerometre_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
_lastX = e.Reading.Acceleration.X;
if(!IsFirst){
_firstX = _lastX;
IsFirst = true;
}
}
private void OnTimerTriggered()
{        
//compare _firstX and _lastX
if(_firstX != _lastX){
...
}
return true;
}

相关内容

最新更新