我正在制作一个自定义滑块组件。头部(你拖动的东西)编程如下:
head.addEventListener(MouseEvent.MOUSE_DOWN, function():void {
head.startDrag(false, new Rectangle(stubDiv,0,width - stubDiv - ((levels-maxLevel)*stubDiv),0));
});
head.addEventListener(MouseEvent.MOUSE_MOVE, function():void {
updateLevel();
});
head.addEventListener(MouseEvent.MOUSE_UP, function():void {
head.stopDrag();
setHeadPos();
});
由于头部受限于滑块区域,因此鼠标可以远离它。如果发生这种情况,对象仍然被拖动,但它不会收到MOUSE_MOVE
个事件,如果鼠标被释放则不会收到MOUSE_UP
事件。
什么是最好的解决方案?
答案 0 :(得分:1)
不要在head的MOUSE_MOVE事件中调用updateLevel(),而是在head的ENTER_FRAME事件中调用它:
head.addEventListener(MouseEvent.MOUSE_DOWN, function():void {
head.startDrag(false, new Rectangle(stubDiv,0,width - stubDiv - ((levels-maxLevel)*stubDiv),0));
head.addEventListener(Event.ENTER_FRAME, function():void { updateLevel(); });
});
head.addEventListener(MouseEvent.MOUSE_UP, function():void {
head.stopDrag();
head.removeEventListener(Event.ENTER_FRAME, function():void { updateLevel(); });
setHeadPos();
});
head.Stage.addEventListener(Event.MOUSE_LEAVE, function():void {
head.stopDrag();
head.removeEventListener(Event.ENTER_FRAME, function():void { updateLevel(); });
setHeadPos();
});
之前我曾经使用过类似的功能,我还需要处理Stage的Mouse_Leave。根据您的要求,您可能还想将MouseEvent.MOUSE_OUT添加到head
答案 1 :(得分:0)
在AS3中,这是通过向侦听MOUSE_UP事件的舞台添加MouseEvent侦听器来处理的。
head.addEventListener(MouseEvent.MOUSE_DOWN, _handleDown);
function _handleDown($evt:MouseEvent):void {
// add a MouseEvent.MOUSE_UP listener to the stage
stage.addEventListener(MouseEvent.MOUSE_UP, _handleUp);
head.removeEventListener(MouseEvent.MOUSE_DOWN, _handleDown);
head.addEventListener(MouseEvent.MOUSE_MOVE, _handleMove);
head.addEventListener(MouseEvent.MOUSE_UP, _handleUp);
head.startDrag(false, new Rectangle(stubDiv,0,width - stubDiv - ((levels-maxLevel)*stubDiv),0)
}
function _handleMove($evt:MouseEvent):void {
updateLevel();
}
function _handleUp($evt:MouseEvent):void {
// remove the MouseEvent.MOUSE_UP listener from the stage
stage.removeEventListener(MouseEvent.MOUSE_UP, _handleUp);
head.removeEventListener(MouseEvent.MOUSE_UP, _handleUp);
head.removeEventListener(MouseEvent.MOUSE_MOVE, _handleMove);
head.addEventListener(MouseEvent.MOUSE_DOWN, _handleDown);
head.stopDrag();
setHeadPos();
}
正如您所看到的,作为一种风格问题,我避免在事件监听器中使用匿名函数。这在大多数情况下允许更大的灵活性,在我看来,更容易阅读。
就你的另一个问题而言,没有“滚动句柄”对MOUSE_MOVE事件作出反应......你是否希望它在你从手柄上滚开后仍然有反应?根据您希望如何工作,可以通过多种方式完成。
请详细说明您正在寻找的行为。