我有一个奇怪的问题。我正在为应用程序创建一个 NUI,并将一些简单的手势绑定到左右箭头。问题是当我开始应用程序时。当我第一次做出手势时,我的应用程序连续点击两次。之后它就100%按照我的要求工作了。只有开始才是问题所在。
我将两个关节和时间戳添加到我的历史结构中,并将其放入 ArrayList
this._history.Add(new HistoryItem()
{
timestamp = timestamp,
activeHand = hand,
controlJoint = controlJoint
}
);
然后在 foreach 循环中我比较数据
if (Math.Abs((hand.Position.X - item.controlJoint.Position.X)) < MainWindow.treshold && Math.Abs((hand.Position.Y - item.controlJoint.Position.Y)) < MainWindow.verticalTreshold)
如果它击中我立即打破循环
break;
之后我清除历史记录 ArrayList
this._history.Clear();
所以我不明白。为什么开始后就连续撞了两次?
// edit
历史ArrayList初始化
private List<HistoryItem> _history = new List<HistoryItem>(16);
in loop
foreach (HistoryItem item in this._history)
{
if ((hand.Position.X - item.controlJoint.Position.X) < MainWindow.treshold)
{
float tmp = (hand.Position.X - controlJoint.Position.X);
MainWindow.slideNumber++;
this._logger.Log("Next slide: " + MainWindow.slideNumber);
this._logger.Log(hand.Position.X + " - " + controlJoint.Position.X + " = " + tmp + " | " + MainWindow.treshold);
this.startTime = 0;
this.gestureStart = false;
answerFlag = true;
System.Windows.Forms.SendKeys.SendWait("{Right}");
break;
}
}
现在。正如你所看到的,我在这里打破了。所以这段代码不应该被连续第二次调用
这如何清除一些东西
// 编辑2
我还将添加,要进入这部分代码,需要将gestureStart 标志设置为true。正如您在进入“if”部分后所看到的,我将其设置为 false。所以代码不可能立即到达这部分
// 编辑3解决方法
我已经创建了一种解决方法。我添加了时间控制。我正在比较调用代码的时间戳和上次手势识别的时间戳。如果它太快(我的意思是几毫秒,这是不可能的),我不允许击中箭头。我不确定这是否是一个完美的解决方案,但它是一个可行的解决方案