後,我有一個奇怪的問題。我正在爲應用程序創建一個NUI,並將一些簡單的手勢綁定到左右箭頭。問題是當我啓動應用程序。當我第一次做手勢時,我的應用程序連續擊中兩次。之後,它可以100%地工作。問題只有一開始。多命中break命令
我加入兩個關節和時間戳到我的歷史結構如果它擊中我瞬間被放入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 工作替代方法
我已經創建了一種變通方法。我增加了時間控制。我比較了調用上次手勢識別的代碼和時間戳的時間戳。如果它的速度太快(我無法制造幾個毫秒),我不允許擊中箭頭。我不知道,如果它是一個完美的解決方案,但它是一個可行的解決方案
這不是很容易跟着你,但什麼是錯與初始化代碼通常這樣的事情發生。 – 2012-04-09 20:57:54
@AndriyBuday難以休耕導致問題很奇怪,很難形容它。如果您需要更多信息,請說出您需要的內容,然後嘗試添加它。關於初始化。 ArrayList的是在節目開始初始化:私人列表 _history =新名單(16);沒有其他 –
Fixus
2012-04-09 21:00:16
你應該粘貼更多的代碼來顯示轉換。另外,由於問題可能出現在init代碼中,你能總結一下你在那裏放的東西嗎? – PPC 2012-04-09 21:01:00