我有一个奇怪的问题。我正在为应用程序创建一个NUI,我将一些简单的手势绑定到右箭头和左箭头。问题是当我开始申请时。当我第一次做出手势时,我的应用程序连续击中了2次。之后,它按我的要求100%工作。只有好处就是问题。
我在我的历史结构中添加了两个Joints和timestamp,它被放入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)
如果它击中我立刻打破lopp
break;
之后我清除历史ArrayList
this._history.Clear();
所以我没理解。为什么在开始之后连续两次击中?
//编辑
历史ArrayList初始化
private List<HistoryItem> _history = new List<HistoryItem>(16);
循环
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 工作方法
我已经创建了一种解决方法。我加入了时间控制。我正在比较调用代码的时间戳和最后一个手势识别的时间戳。如果它太快(我几分钟无法制作的话)我不允许打箭头。我不确定它是否是一个完美的解决方案,但它是一个有效的解决方案
答案 0 :(得分:1)
好吧我的问题是代码。 Ofc在调试中无法解决的小错误。我用一个函数来分析帧的历史。
该方法有两种模式。我分离了它并创建了两个不同的方法,每个方法用于每个任务,现在它工作得很好