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