我想模仿我正在開發的Flash應用程序中的iPhone滾動行爲。這個想法是使拖放具有一定的慣性/減速度(你知道,當你在光標移動時放下某物並且物體會繼續移動片刻然後停止)。flash as3慣性拖拽
我爲我的動畫使用TweenMax庫。
任何想法將不勝感激。
感謝
我想模仿我正在開發的Flash應用程序中的iPhone滾動行爲。這個想法是使拖放具有一定的慣性/減速度(你知道,當你在光標移動時放下某物並且物體會繼續移動片刻然後停止)。flash as3慣性拖拽
我爲我的動畫使用TweenMax庫。
任何想法將不勝感激。
感謝
當我最近創建了這樣的事情,我只是聽了MOUSE_DOWN和MOUSE_UP,每當我估摸出鼠標按鈕被按下(即在中間的兩個事件,也尊重Event.MOUSE_LEAVE)我會標記它,例如使用_mouseIsDown類範圍變量。
然後,我會有一個ENTER_FRAME事件處理程序或計時器,根據是否按下按鈕,其行爲會有所不同。
當鼠標按鈕關閉時,ENTER_FRAME處理程序只是將目標對象移動到新的鼠標位置。它還會從前一箇中減去當前的鼠標位置,以獲得速度向量。最後,它會記錄當前的鼠標位置,以允許上述情況再次發生在下一幀。
但是,如果釋放鼠標按鈕,它不會僅使用1:1映射將鼠標位置移動到目標對象,而是根據速度向量移動它。它也會減少速度向量的長度,直到它接近於零,整個系統纔會進入空閒狀態以節省資源。
一個簡化的解決方案看起來像這樣,忽略mouseIsDown標誌的設置和重置。
private function _handleEnterFrame(ev : Event) : void
{
if (_mouseIsDown) {
// Set speed here, but don't use it while mouse is pressed
_speed.x = stage.mouseX - _prev_mouse_pos.x;
_speed.y = stage.mouseY - _prev_mouse_pos.y;
// Instead, just move target object accordingly
_targetObject.x = stage.mouseX;
_targetObject.y = stage.mouseY;
}
else {
// Mouse is released, meaning that it has been tossed, so move
// object according to speed vector, and decrease speed.
_targetObject.x += _speed.x;
_targetObject.y += _speed.y;
_speed.x *= 0.8;
_speed.y *= 0.8;
// Negligible speed, so stop the processing to save resources
if (_speed.length < 0.05) {
this.removeEventListener(Event.ENTER_FRAME, _handleEnterFrame);
}
}
_prev_mouse_pos.x = stage.mouseX;
_prev_mouse_pos.y = stage.mouseY;
}
顯然,無論何時按下鼠標,您都需要開始監聽ENTER_FRAME事件。此外,您需要具有相應的類作用域變量_prev_mouse_pos和_speed,這兩個flash.geom.Point實例以及_targetObject是您希望通過拖動影響的任何顯示對象。
謝謝......將調查此 – mga 2009-12-22 00:18:36
它的作品足夠好。你提到的矢量對象不適合我(_speed:Vector?)。我只用了x因爲它是無維的。我使用mouse_move並設置了一些端點和一個補間,但切換到這種方法。 – mga 2009-12-23 22:53:41
你會如何去指數/二次方便? – mga 2009-12-23 22:54:11