现在的位置: 首页 > 综合 > 正文

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

2012年12月23日 ⁄ 综合 ⁄ 共 2371字 ⁄ 字号 评论关闭
 

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

抱歉!评论已关闭.