ActionScript3 Hacks.1---防止元件被拖呲了

ActionScript3Hacks

Chapter1防止元件被拖呲了

ByEmilMatthew


Date:08.10.06

Email:emilmatthew@126.com

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

<!--EndFragment-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值