问题描述
正在寻找检测设备是否未移动的方法,同时使用加速度计 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 时总是相同的值, 但我想检查移动设备cordiante是否在1分钟后发生变化 任何解决方案,请提前致谢。
解决方法
您正在做的是在视图出现时附加一个事件处理程序。然后您稍等片刻,再附上另一个。
当加速度计触发时,两个事件处理程序都会激活并写入 oldx
和 newx
,这就是为什么您会看到这两个值相同的原因。
相反,如果我是你,我会简单地附加一个事件处理程序并保存值 + 事件触发的时间。然后你可以在你的计时器中比较它的触发时间。
这可能看起来像:
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,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;
}