2013-07-22 27 views
0

我有一個圖像,用戶可以拖動到右側,它會彈回,當用戶釋放它。我想在用戶快速拖動並釋放它時執行一些代碼。現在我有一個非常尷尬的要求,即用戶可以拖動圖像,然後將其保持任意時間(例如5秒),然後快速拖動並釋放它。只要圖像在釋放時超過一定的速度,它就會執行代碼。如果它低於最低速度,它會執行一些不同的代碼。這意味着我無法計算手勢開始和結束之間的時間長度,並根據時間長度執行代碼。我能做什麼?我想我需要知道圖像在手勢結束前的最後500毫秒內的移動速度。不過,我已經打了一個磚牆找出如何做到這一點。任何幫助將不勝感激。如何計算用戶拖動圖像的速度?

您能否請您在答案中包含一個解釋和可能的示例代碼,因爲這將是一個很好的幫助。

+2

看一看'UIPanGestureRecognizer'' velocityInView'方法。 – bobnoble

+0

你可以發佈一些代碼嗎?正如@bobnoble提到的,如果你使用手勢識別器,那麼獲得速度是微不足道的。 – Can

+0

我正在使用UIPanGestureRecognizer。當我到達我的電腦時,我會在今天發佈一些代碼。爲什麼不需要用UIPanGestureRecognizer獲得速度? –

回答

0

在互聯網上尋找更多的東西后,我終於回答了我自己的問題。

我計算出什麼我需要做的:

我UIPanGestureRecognizer:

- (IBAction)handlePan3:(UIPanGestureRecognizer *)recognizer3 

獲取用戶的手指在屏幕上移動的速度:

CGPoint vel = [recognizer velocityInView:self.myView]; 

然後:

if (vel.x > /*value*/) { 
// Your code 
} 

我正要放棄,但不是!最後我到了那裏。感謝大家的幫助。我已經提出了一個或兩個答案,因爲它們很有幫助。 bobnoble實際上給出了使用velocityInView的建議,我發現這個其他堆棧溢出問題給了我需要的信息:iOS - Making sense of velocityInView on UIPanGesture

1

如果您獲取圖像拖動時的X,Y座標的起始位置,以及釋放鼠標時的X,Y座標,則可以使用畢達哥拉斯的範數來計算兩點之間的距離:http://en.wikipedia.org/wiki/Pythagorean_theorem

另外,如果你當鼠標移動(和鼠標按鈕向下)啓動定時器,並在鼠標鬆開事件停止它,則可以使用的時間和距離計算速度(速度=距離/時間)

編輯下面的評論:

point delayedMousePos; 
point previousMousePos; 

bool secondDrag = false; 
bool isStopped = false; 

var timeFirstStopped; 
var positionCount = 0; 

array previousMousePositions[3]; 

// timer which monitors mouse position (set to an interval of say, 10ms) 
function timerMonitorMousePos_Elapsed() { 
    point currentMousePos = getMousePos(); 

    if (isStopped == false) { 
     if (positionCount >= 2) { 
      array_shift(previousMousePositions); // remove the first element of the array and move everything down to reindex numerical array to start counting from zero 
      positionCount = 2; // keep positionCount within array bounds 
     } 

     previousMousePositions[positionCount] = currentMousePos; // add the new position to the end of the 'stack' 
     positionCount++; 
    } 

    if (currentMousePos == previousMousePos) { // start check for stationary 
     isStopped = true; 
     if (timeFirstStopped == null) { 
      timeFirstStopped = NOW(); 
     } else { 
      if (NOW() - timeFirstStopped >= 500) { // we have been stopped for at least 500ms (assumes time is counted in milliseconds) 
       secondDrag = true; 
       // previousMousePositions[0] = the mouse position 30ms before the mouse stopped 
      } 
     } 
    } else { 
     isStopped = false; 
     timeFirstStopped = null; 
    } 

    previousMousePos = currentMousePos; 
} 
+0

感謝您的回覆。正如我在我的問題中提到的那樣,我的尷尬境況意味着我無法做到這一點,因爲用戶需要能夠通過拖動暫停一半,然後快速移動圖像並釋放並仍然激活代碼。我需要在用戶釋放圖像之前真正計算最終速度。如果這是有道理的。它不能計算從開始到結束的速度,只是釋放之前的最後一個毫秒。 –

+0

您可以使用另一個計時器來監視鼠標位置,以查看它是否在拖動時停止移動,然後使用布爾開關讓mousemove事件知道下一次移動時它將成爲「第二次拖動」。你也可以使用這個計時器來選擇一個不同的鼠標座標來計算你的距離/速度? – Alfie

+0

我不認爲這將工作,因爲我需要它。如果我錯了,請糾正我的錯誤,但我相信這不會讓用戶真的很慢地拖動圖像,大約需要10秒鐘,然後快速移動並放開,而不會停下來。 –

0

我不會使用計時器。當拖動開始時,我只會將起始日期/時間與x,y位置一起保存。

拖動結束後,保存結束日期/時間和位置。從這些信息中,我可以計算以像素爲單位的距離和以毫秒爲單位的持續時間。

+0

我不認爲這會工作,因爲我需要它,因爲它不會允許用戶移動圖像緩慢地在開始時,然後在釋放之前,快速移動並釋放。我認爲我需要做的就是計算圖像在最近500毫秒內的速度,並確定代碼是否執行。 –