flash as3惯性拖放

flash as3惯性拖放,flash,actionscript-3,drag-and-drop,Flash,Actionscript 3,Drag And Drop,我想在我正在开发的Flash应用程序中模仿iPhone的滚动行为。这个想法是通过一定的惯性/减速来启用拖放功能(你知道,当你在光标仍在移动的情况下拖放某个东西时,该东西会继续移动一段时间,然后停止) 我正在使用库制作动画 如有任何意见,将不胜感激 感谢当我最近创建这样的东西时,我只听MOUSE\u DOWN和MOUSE\u UP,并且每当我认为鼠标按钮被按下时(即在这两个事件之间,也与Event.MOUSE\u LEAVE有关),我都会这样标记它,例如使用_mouseIsDown类范围变量 然后

我想在我正在开发的Flash应用程序中模仿iPhone的滚动行为。这个想法是通过一定的惯性/减速来启用拖放功能(你知道,当你在光标仍在移动的情况下拖放某个东西时,该东西会继续移动一段时间,然后停止)

我正在使用库制作动画

如有任何意见,将不胜感激


感谢

当我最近创建这样的东西时,我只听MOUSE\u DOWN和MOUSE\u UP,并且每当我认为鼠标按钮被按下时(即在这两个事件之间,也与Event.MOUSE\u 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;
}
private function\u handleinterframe(ev:Event):无效
{
如果(_mouseIsDown){
//在此处设置速度,但在按下鼠标时不要使用
_速度.x=stage.mouseX-_prev_mouse_pos.x;
_speed.y=stage.mouseY-_prev_mouse_pos.y;
//相反,只需相应地移动目标对象
_targetObject.x=stage.mouseX;
_targetObject.y=stage.mouseY;
}
否则{
//鼠标被释放,这意味着它已被抛出,所以请移动
//根据速度矢量创建对象,并降低速度。
_targetObject.x+=\u speed.x;
_targetObject.y+=\u speed.y;
_速度x*=0.8;
_速度y*=0.8;
//速度可以忽略不计,因此请停止处理以节省资源
如果(_speed.length<0.05){
this.removeEventListener(Event.ENTER\u FRAME,\u handleEnterFrame);
}
}
_prev_mouse_pos.x=stage.mouseX;
_prev_mouse_pos.y=stage.mouseY;
}

显然,只要按下鼠标,您就需要开始侦听ENTER_FRAME事件。此外,您还需要具有适当的类范围变量_prev_mouse_pos和_speed,这两个都是flash.geom.Point的实例,以及_targetObject,它是您希望通过拖动来影响的任何显示对象。

它工作得很好。你提到的向量对象不适合我(_speed:vector?)。我只使用了x,因为它是无维度的。我使用mouse_move设置了一些端点和一个tween,但切换到了这个方法。你会如何进行指数/二次缓和?我说的不是向量类,而是数学意义上的向量。内置的点类可以用作二维向量。关于你的下一个问题;上面的方法应该自动“缓解”,因为它会在速度降低时保持动画效果(_speed.x*=0.8)。是的,我知道它会自动缓解。。。但这是一个持续的放松(0.8倍于之前的速度),我希望有一个指数级的放松