[转]诡异的现象:发现文档类mouseChildren和其他Sprite的区别
程序员文章站
2022-07-09 15:51:07
...
http://bbs.9ria.com/viewthread.php?tid=86648&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000
本帖最后由 flashk 于 2011-6-28 19:12 编辑
import flash.display.Sprite;
import flash.events.MouseEvent;
var s2:Sprite = new Sprite();
s2.graphics.beginFill(0xFF3300,0.5);
s2.graphics.drawRect(0,0,100,50);
this.addChild(s2);
this.mouseChildren = false;
this.addEventListener(MouseEvent.CLICK,traceOK);
function traceOK(e:MouseEvent)
{
trace("click");
}
把上面的这段代码放到一个文档类里测试。
然后你把这个代码放到另外一个自定义Sprite子类里,文档类里代码删掉,直接new这个子类,addChild。
测试下看。会让你大吃一惊。
简单的说就是文档类一旦设定mouseChildren是不会输出click的,子Sprite这样设定倒会输出。有人知道原因?
bug?Flash Player故意这样处理的?
其实也就是说文档的mouseChildren这个属性和其他Sprite处理是不一样的。虽然文档类也从Sprite继承。
再测了一下:
其实文档类完全就是不同的处理
mouseEnabled mouseChildren 两个属性都是不同的处理
比如一个Shape放到文档类得子Sprite里,这时候点击是会有输出的,但如果放到文档类里,是没有输出和点击的。
同样,MOUSE_UP,mouseMove,mouseOver,mouseDown都会受此属性的影响,但不会影响Stage的鼠标事件。
总结起来就是,
3个InteractiveObject的子类(文档类是Sprite的子类,Stage不是)他们各自mouseEnabled和mouseChildren的特点:
Stage:不管你flashplayer里放不放内容,就算你整个都是空的,也不管你别的对象mouseChildren如何设置。stage都会接收MouseEvent.CLICK,mouseMove,mouseDown等事件。stage.mouseChildren不影响文档类和其子对象。就是尽管文档类是stage的子对象,但不受此属性影响(这个好像我搞错了,重测试了下,和文档类效果一样)。this.stage.getChildAt(0) = [object MainTimeline] = 文档类的this
文档类:如果文档类下面只有个Shape,不管mouseEnabled设为何值,都不会接收鼠标事件。就是文档类下的Shape是不会产生鼠标事件的。mouseChildren = false会禁止所有的除stage外的鼠标事件(包括文档类自己)
Sprite:如果Sprite下面有个Shape,这个Shape在mouseEnabled=true是会产生鼠标事件的,mouseEnabled=false不产生。mouseChildren = false只禁止子交互对象的鼠标事件。如果Sprite本身包含Shape并且mouseEnabled=true自己会产生鼠标事件。就算没有子Shape,尽管将mouseChildren=false,只要有子显示对象(Sprite等),和mouseEnabled=true就会本身产生鼠标事件,尽管它的子对象不产生鼠标事件。
mouseChildren 是管子对象是否接收鼠标事件
mouseEnabled 是管自己是否接收鼠标事件
通过楼主的例子得出 文档类的 mouseChildren 设置为 false 时, 相当于 mouseEnabled也自动变成false的效果了。 而不是文档类则没有这种情况。 我也不理解ADOBE为什么要这么做
本帖最后由 flashk 于 2011-6-28 19:12 编辑
import flash.display.Sprite;
import flash.events.MouseEvent;
var s2:Sprite = new Sprite();
s2.graphics.beginFill(0xFF3300,0.5);
s2.graphics.drawRect(0,0,100,50);
this.addChild(s2);
this.mouseChildren = false;
this.addEventListener(MouseEvent.CLICK,traceOK);
function traceOK(e:MouseEvent)
{
trace("click");
}
把上面的这段代码放到一个文档类里测试。
然后你把这个代码放到另外一个自定义Sprite子类里,文档类里代码删掉,直接new这个子类,addChild。
测试下看。会让你大吃一惊。
简单的说就是文档类一旦设定mouseChildren是不会输出click的,子Sprite这样设定倒会输出。有人知道原因?
bug?Flash Player故意这样处理的?
其实也就是说文档的mouseChildren这个属性和其他Sprite处理是不一样的。虽然文档类也从Sprite继承。
再测了一下:
其实文档类完全就是不同的处理
mouseEnabled mouseChildren 两个属性都是不同的处理
比如一个Shape放到文档类得子Sprite里,这时候点击是会有输出的,但如果放到文档类里,是没有输出和点击的。
同样,MOUSE_UP,mouseMove,mouseOver,mouseDown都会受此属性的影响,但不会影响Stage的鼠标事件。
总结起来就是,
3个InteractiveObject的子类(文档类是Sprite的子类,Stage不是)他们各自mouseEnabled和mouseChildren的特点:
Stage:不管你flashplayer里放不放内容,就算你整个都是空的,也不管你别的对象mouseChildren如何设置。stage都会接收MouseEvent.CLICK,mouseMove,mouseDown等事件。stage.mouseChildren不影响文档类和其子对象。就是尽管文档类是stage的子对象,但不受此属性影响(这个好像我搞错了,重测试了下,和文档类效果一样)。this.stage.getChildAt(0) = [object MainTimeline] = 文档类的this
文档类:如果文档类下面只有个Shape,不管mouseEnabled设为何值,都不会接收鼠标事件。就是文档类下的Shape是不会产生鼠标事件的。mouseChildren = false会禁止所有的除stage外的鼠标事件(包括文档类自己)
Sprite:如果Sprite下面有个Shape,这个Shape在mouseEnabled=true是会产生鼠标事件的,mouseEnabled=false不产生。mouseChildren = false只禁止子交互对象的鼠标事件。如果Sprite本身包含Shape并且mouseEnabled=true自己会产生鼠标事件。就算没有子Shape,尽管将mouseChildren=false,只要有子显示对象(Sprite等),和mouseEnabled=true就会本身产生鼠标事件,尽管它的子对象不产生鼠标事件。
mouseChildren 是管子对象是否接收鼠标事件
mouseEnabled 是管自己是否接收鼠标事件
通过楼主的例子得出 文档类的 mouseChildren 设置为 false 时, 相当于 mouseEnabled也自动变成false的效果了。 而不是文档类则没有这种情况。 我也不理解ADOBE为什么要这么做
上一篇: 微服务治理实践:如何对单点异常进行自动摘除 框架spring
下一篇: 验证类