如何跟踪一个完整的显示列表用递归函数? [英] How to trace a full Display List with a recursive function?

查看:256
本文介绍了如何跟踪一个完整的显示列表用递归函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望看到的特定<一个显示列表的所有实例href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html"相对=nofollow>的DisplayObjectContainer 。如何与一个递归函数做看超出第一深度δ

I want to see all instances on the Display List of a specific DisplayObjectContainer. How to do it with a recursive function to see beyond the first depth ?

推荐答案

下面一个简单的递归函数来跟踪显示列表。在一个影片剪辑,该行: traceDisplayL(这一点,2); 可输出:

Here a simple recursive function to trace a Display List. In a MovieClip, this line : traceDisplayL(this, 2); can output:

 root1 MainMe
     Alone Symbol1
         Shape
     BigOne Symbol2
         Shape
         InBigOne Symbol3

进口部分:

import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.MovieClip; 
import flash.utils.getQualifiedClassName;

traceDisplayL 功能:(不要使用 currentDepth 参数,保留原样)。

The traceDisplayL function: (don't use the currentDepth parameter, leave it as is)

    public function traceDisplayL(displayObject:DisplayObject, maxDepth:int = 20, levelSpace:String = " ", currentDepth:int = 0) {

        var className:String = String(getQualifiedClassName(displayObject));
        var indexOfString:int = className.lastIndexOf("::");
        className = (indexOfString < 0) ? className : className.slice(indexOfString + 2);

        var displayName:String =  String((displayObject.name.substr(0, 8) == "instance") ? "" : displayObject.name + " ");

        trace(levelSpace + displayName + className);   

        if (displayObject is DisplayObjectContainer && currentDepth < maxDepth) {       
            for (var i:int = 0; i < DisplayObjectContainer(displayObject).numChildren; i++) {
                traceDisplayL(DisplayObjectContainer(displayObject).getChildAt(i), maxDepth, levelSpace + "    ", currentDepth + 1);
            }
        }
    }

和更精细的一个 traceDisplayList (使用其他两个函数)。你会看到在旁边的文字,如果对象是一个文本字段,如果你想:

And a more elaborate one traceDisplayList (using two other functions). You will see text on the side if the object is a TextField, and if you want to:

  • 在唯一的实例对象(那些谁拥有一个名字);
  • 对象相关的数据(.X,.Y,.WIDTH,.height);
  • 父对象名称,对象名称后;

您也可以限制的最大深度,和/或跳过某个特定类的所有对象(如果你不希望看到任何图形或任何在您的跟踪)。

You can also limit the maximum depth, and/or skip all objects of a specific Class (if you don't want to see any Shape or Whatever in your trace).

    public static function traceDisplayList(displayObject:DisplayObject, instanceOnly:Boolean = false, withData:Boolean = false, withParent:Boolean = false, maxDepth:int = 100, skipClass:Class = null, levelSpace:String = " ", currentDepth:int = 0, parent:String = ""):void 
    {
        if (skipClass != null) { if (displayObject is skipClass) { return; } }

        var displayName:String = displayObjectCleanName(displayObject);
        displayName += (displayName != "") ? " " : "";
        if (instanceOnly && displayName == "") { return; }

        var className:String = getCleanClassName(displayObject);

        var text:String = (className == "TextField") ? String(" \"" + TextField(displayObject).text) + "\"" : ""

        var objectName:String = displayName + className + text;

        var dataString:String = (withData) ? String(" [x:" + displayObject.x + " y:" + displayObject.y + " width:" + displayObject.width + " height:" + displayObject.height + "]") : "";

        var parentName:String = (withParent && parent != "") ? String(" (" +  parent + ")") : "";   

        var levelStr:String = (withParent) ? String(currentDepth + " ") : "";

        trace(levelStr + levelSpace + objectName + dataString + parentName);

        if (displayObject is DisplayObjectContainer && currentDepth < maxDepth)
        {       
            for (var i:int = 0; i < DisplayObjectContainer(displayObject).numChildren; i++)
            {
                traceDisplayList(DisplayObjectContainer(displayObject).getChildAt(i), instanceOnly, withData, withParent, maxDepth, skipClass, levelSpace + "    ", currentDepth + 1, objectName);
            }
        }
    }   

    public static function getCleanClassName(obj:*):String 
    {
        var className:String = String(getQualifiedClassName(obj));
        var indexOfString:int = className.lastIndexOf("::");
        className = (indexOfString < 0) ? className : className.slice(indexOfString + 2);
        return className;           
    }

    public static function displayObjectCleanName(displayObject:DisplayObject):String
    {
        return String((displayObject.name.substr(0, 8) == "instance") ? "" : displayObject.name);
    }

这篇关于如何跟踪一个完整的显示列表用递归函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆