开启左侧

[CSS] kirupa每日ActionScript3翻译系列:DisplayObjectContainer的con

[复制链接]
发表于 2012-5-26 23:38:14 | 显示全部楼层 |阅读模式

原标题:DisplayObjectContainer contains()
原文:http://www.kirupa.com/forum/showpost.php?p=1948060&postcount=194
翻译:精品闪客 www.flashbbs.org

利用ActionScript3,你可以很容易的利用contains方法(flash.display.DisplayObjectContainer.contains()),判断一个sprite或者Display object 是否包含其他的Display object.如果传入的display object属于目标display object或者他的子对象,contains方法就会返回true。

举例:
  1. var king:Sprite = new Sprite();
  2. var queen:Sprite = new Sprite();
  3. var jack:Sprite = new Sprite();
  4. var joker:Sprite = new Sprite();
  5. queen.addChild(jack);
  6. king.addChild(queen);
  7. addChild(king);
  8. addChild(joker);
  9. trace(king.contains(queen)); // true
  10. trace(king.contains(jack)); // true
  11. trace(king.contains(joker)); // false
  12. 复制代码
复制代码

如果,你只想决定一个对象是直接属于另一个对象,而不是属于该对象的子对象,只要把该对象与被检查对象的parent属性相比较即可。
  1. trace(queen.parent == king); // true
  2. trace(jack.parent == king); // false
  3. 复制代码
复制代码
平度网:www.pingdu.co 平度论坛:bbs.pingdu.co
发表于 2012-5-26 23:38:25 | 显示全部楼层


flowind如果愿意的话.大家一块翻译吧.这些天忙的都给忘了.
http://bbs.blueidea.com/forum.php?mod=viewthread&tid=2664524
平度网:www.pingdu.co 平度论坛:bbs.pingdu.co
 楼主| 发表于 2012-5-26 23:38:31 | 显示全部楼层


xxwei,好啊,当然可以。

不过,看到帖子里你翻译的那些,大部分flashseer.org都翻过了,不知道那里是不是引用的你的翻译。

为了避免重复,我基本上时从后往前的顺序。

同时,我翻译的都会把原文的标题(英文版的帖子标题)贴出来,便于检索。

我翻译的会暂时继续跟在这个帖子里。
平度网:www.pingdu.co 平度论坛:bbs.pingdu.co
 楼主| 发表于 2012-5-26 23:38:39 | 显示全部楼层


btw,昨天刚看到你的邮件。
你的blog链接我已经加上。
平度网:www.pingdu.co 平度论坛:bbs.pingdu.co
 楼主| 发表于 2012-5-26 23:38:44 | 显示全部楼层


原标题:Cleaning Up Event Listeners
原文:http://www.kirupa.com/forum/showpost.php?p=1948087&postcount=195
翻译:精品闪客 www.flashbbs.org

As3的显示对象如果不处于一个显示列表中或者不可见时,它本身可能还是存在的。当你把一个显示对象从显示列表中移除的时候,你并不能阻止这个对象继续出发事件(比如鼠标事件)。这就意味着即使一个显示对象从屏幕上被删除掉了,它的enterFrame事件还可能被触发。这和ActionScript1和2不一样,那里删除一个影片意味着删除了整个影片以及所有和他相关的事件。

如果你希望从显示列表移除一个显示对象的时候,同时停止它的enterFrame事件,你必须手动来完成。方便的做法是当一个显示对象从它的parent中被删除的时候,利用removed事件来判断。你甚至可以使用added事件来判断它什么时候被添加(你可以在这里重新添加enterFrame事件处理器)。

举例:
  1. var sprite:Sprite = new Sprite();
  2. sprite.addEventListener(Event.ADDED, addEnterFrame);
  3. sprite.addEventListener(Event.REMOVED, removeEnterFrame);
  4. // add/remove enter frame event
  5. function addEnterFrame(evt:Event):void {
  6. trace("added");
  7. sprite.addEventListener(Event.ENTER_FRAME, enterFrame);
  8. }
  9. function removeEnterFrame(evt:Event):void {
  10. trace("removed");
  11. sprite.removeEventListener(Event.ENTER_FRAME, enterFrame);
  12. }
  13. function enterFrame(evt:Event):void {
  14. trace("Time: " + getTimer());
  15. }
  16. // add and remove by clicking
  17. stage.addEventListener(MouseEvent.CLICK, addRemove);
  18. function addRemove(evt:Event):void {
  19. if (this.contains(sprite)) {
  20. this.removeChild(sprite);
  21. }else{
  22. this.addChild(sprite);
  23. }
  24. }
  25. 复制代码
复制代码

如果在sprite被移除时,没有利用removed来清空sprite的enterFrame事件监听器。即使sprite对象从当前的显示列表被移除了,它还会继续触发enterFrame事件。

结果:
  1. added
  2. Time: 813
  3. Time: 927
  4. removed
  5. added
  6. Time: 2509
  7. Time: 2597
  8. removed
  9. 复制代码
复制代码
平度网:www.pingdu.co 平度论坛:bbs.pingdu.co
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

 
QQ在线咨询
售前咨询热线
0532-88371356
售后服务微信
pingduwangzhan
快速回复 返回顶部 返回列表