我想模仿我正在开发的Flash应用中的iPhone滚动行为。这个想法是通过一定量的惯性/减速来实现拖拽(你知道,当你在光标移动的时候掉落东西并且东西会继续移动片刻然后停止)。
我正在使用TweenMax库来制作动画。
任何想法都将受到赞赏。
由于
答案 0 :(得分:3)
当我最近创建这样的东西时,我只是听了MOUSE_DOWN和MOUSE_UP,每当我按下鼠标按钮时(即在这两个事件之间,也尊重Event.MOUSE_LEAVE)我会标记为这样,例如使用_mouseIsDown类范围变量。
然后我会有一个ENTER_FRAME事件处理程序或一个计时器,根据按钮是否被按下,它会表现不同。
当鼠标按钮关闭时,ENTER_FRAME处理程序只是将目标对象移动到新的鼠标位置。它还将从前一个鼠标位置中减去当前鼠标位置,以获得速度矢量。最后,它会记录当前鼠标位置,以允许在下一帧再次发生上述情况。
如果释放鼠标按钮,它不会仅使用1:1映射到鼠标位置来移动目标对象,而是根据速度向量移动它。它还会减少每个tick的速度向量的长度,直到它足够接近零,以使整个系统进入空闲状态以节省资源。
简化的解决方案如下所示,忽略了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,它是您希望通过拖动影响的任何显示对象。