从as3鼠标事件说起

发布于 2012-07-01  419 次阅读


 

  • 诡异的localX localY: 

 

as3的鼠标事件MouseEvent有stageX,stageY属性以及localX,localY属性。之前以为localX和localY就是注册事件侦听器的对象左上角为原点的坐标值,其实不然。localX localY和侦听器放在哪里无关,只和鼠标放在哪个对象上有关,即是发生事件的时候鼠标所在对象的左上角为原点。

  • 在做照片裁剪上传的组件,需要获得控制块相对于父级的坐标:

 

    1. 直接使用stageX和stageY的话,在父级刚好在舞台(0,0)位置的情况凑巧可行,但是父级一旦移动就对不上了,使用localX,localY获得的坐标自然是错误的。之后找到办法是从父级的transform属性中获取concatenatedMatrix,即从父级sprite到舞台的变换矩阵。这个矩阵的(stageX,stageY)-(tx,ty)刚好得到正确的坐标。
    2. 这个方法对于一般情况是可以了,不过我想得更变态了一点,如果父级的变换矩阵中存在旋转呢?给父级加上一个rotation之后果然坐标又对不上了。于是终极的解决方案来了。获取父级的transform.concatenatedMatrix赋给m,m.invert()获得逆矩阵,即从舞台坐标系到父级坐标系的变换矩阵。从stageX,stageY构建一个Point p,p=m.transformPoint(p);此时p的x,y就是鼠标相对于父级的坐标了,可以直接赋值给控制块了。

 

 

  • MOVE,ROLL,OVER,OUT:

 

MOUSE_MOVE则是鼠标在对象上移动就会触发,值得注意的是侦听stage的MOUSE_MOVE事件,即使鼠标出了舞台还是会触发。 

 MOUSE_OVER和ROLL_OVER,MOUSE_OUT,ROLL_OUT都是在鼠标进出对象的时候触发一次,顾名思义OVER是移入,OUT是移出。MOUSE和ROLL的区别在于,MOUSE_OVER MOUSE_OUT在进出对象的子对象时会触发,而ROLL把组件和它的子级看做一体的,在进出子级对象的时候不会触发。

这个问题更具体的实验过程可以参见此贴:

http://wgcode.iteye.com/blog/1205494 

 



点击数:89


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。