ActionScript3Hacks
Chapter1防止元件被拖呲了
ByEmilMatthew
Date:08.10.06
Email:[email protected]
Blog:http://blog.csdn.net/emilmatthew
拖动在我们的交互应用中那可谓是相当初级的应用了,谁都会用,不是吗?
//以下代码为ActionScript3, 舞台上已有一个叫circle的元件
circle.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownFun)
circle.addEventListener(MouseEvent.MOUSE_UP,mouseReleasedFun);
circle.buttonMode=true; //设定鼠标移上时呈现手型
functionmouseDownFun(event:MouseEvent):void{
circle.startDrag();
}
functionmouseReleasedFun(event:MouseEvent):void{
circle.stopDrag();
}
这段代码谁都看得懂,也很明白,鼠标按下时触发元件的拖动事件,放开时触发元件的释放事件。
不过,以上“教科书”式的代码确有一个天然的问题,就是会出现拖呲的情况。简单来说,就是当鼠标移动到FlashPlayer播放区域外再释放时,FlashPlayer就无法捕获相应的MouseUP事件,因而会出现即使鼠标没有按下,元件也会跟着动的"拖呲"的情况。
大家试着点着鼠标不放,拖出Flash的区域后再释放,然后将鼠标移进Flash的区域,此时便出现的拖呲的情况了。
在AS3的startDrag函数中,有一个关于拖动区域的参数(以Rect对象传入),
如限定拖动矩形区域为(0,0)-(300,300)。
circle.startDrag(false,newRectangle(0,0,300,300));
效果如下面的swf所示:
但很可惜,它只能限定拖动区域,未能解决拖呲的问题。
好的,是时候来解决拖呲的问题了,其实,思路相信大家都有的,主是做一个全局的监听,当鼠标的坐标移出某个区域时,释放鼠标。如果startDrag当被拖动在第二个矩形所限制的范围时能派发出事件,那就方便了,可惜好现没有办法找到这个事件~~~囧
OK,就让我们来解决拖呲的问题,方案虽然不是很优雅,但真的有效,重点是,暂时找不到更好的方案,如果您有的话,还请告知。
对我们的代码做入下改动:
//增加区域限制变量
varlx:int=10;
varlx:int=10;
varlw:int=400;
varlh:int=300;
//修改限制区域
circle.startDrag(false,newRectangle(lx,ly,lw,lh));
functionmouseDownFun(event:MouseEvent):void{
//circle中心点位于左上角
circle.startDrag(false,
newRectangle(lx,ly,lw-circle.width,lh-circle.height));
VM_STATUS=CHECK; //增加,鼠标区域检测状态控制
}
functionmouseReleasedFun(event:MouseEvent):void{
circle.stopDrag();
VM_STATUS=IDLE; //增加,鼠标区域检测状态控制
}
//增加,鼠标区域检测
varareaCheckVM:Sprite=newSprite();
areaCheckVM.addEventListener(Event.ENTER_FRAME,enterframe_fun);
varVM_STATUS:int=0;
varIDLE:int=0;
varCHECK:int=1;
function enterframe_fun(evt:Event):void
{
switch(VM_STATUS)
{
caseIDLE:
break;
caseCHECK:areaCheck();
break;
}
}
functionareaCheck():void
{
if(this.mouseX<lx)
{
circle.x=lx+1;
mouseReleasedFun(null);
}
elseif(this.mouseX>lx+lw)
{
circle.x=lx+lw-circle.width-1;
mouseReleasedFun(null);
}
elseif(this.mouseY<ly)
{
circle.y=ly+1;
mouseReleasedFun(null);
}
elseif(this.mouseY>ly+lh)
{
circle.y=ly+lh-circle.height-1;
mouseReleasedFun(null);
}
}
OK,让我们看一下效果吧,淡黄色的区域为我们的移动限制区域,怎么样,拖呲的问题没了吧?
就到这里吧,下回再见。
附:测试代码下载(请用FlashCS3编译)
http://www.6dtop.com/labs/as3hacks/chp1.dragAreaControl.rar