闪烁as3拖放与惯性

时间:2009-12-21 19:10:58

标签: flash actionscript-3 drag-and-drop

我想模仿我正在开发的Flash应用中的iPhone滚动行为。这个想法是通过一定量的惯性/减速来实现拖拽(你知道,当你在光标移动的时候掉落东西并且东西会继续移动片刻然后停止)。

我正在使用TweenMax库来制作动画。

任何想法都将受到赞赏。

由于

1 个答案:

答案 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,它是您希望通过拖动影响的任何显示对象。

相关问题