回答
container.getChildIndex(displayObject);
的指数,但只有这样才能告诉你它有多深,不一定在它前面有任何东西。
container.getChildIndex(child)
应该这样做,它返回子
private function getDepth(clip:DisplayObject):uint
{
var depth:uint = 0;
var currentClip:DisplayObject = clip;
while (currentClip.parent && currentClip.parent != this)
{
depth++;
currentClip = currentClip.parent;
}
return depth;
}
键入参数作为DisplayObject会更有用(IE:TextFields,MovieClips等)。 ) – TheDarkIn1978 2011-03-24 17:40:34
你是对的。无论如何,考虑到已验证的答案,我误解了这个问题 – Kodiak 2011-03-24 21:23:34
函数比较两个DisplayObject实例进行,以确定哪一个是在显示列表上的更高的“深度”:
private function higher(a:DisplayObject, b:DisplayObject):DisplayObject
{
// Parent chains
var ac:Array = [a];
var bc:Array = [b];
// Pointers to individual nodes
var an:DisplayObject = a.parent;
var bn:DisplayObject = b.parent;
while (an != null) {
ac.push(an);
an = an.parent;
}
while (bn != null) {
bc.push(bn);
bn = bn.parent;
}
var acl:int = ac.length;
var bcl:int = bc.length;
var n:int = Math.min(acl, bcl);
var i:int = 0;
for (; i < n; i++) {
an = ac[acl - i - 1];
bn = bc[bcl - i - 1];
// First uncommon ancestor
if (an != bn)
break;
}
var ca:DisplayObjectContainer = an.parent;
if (!ca)
return null;
if (ca.getChildIndex(an) > ca.getChildIndex(bn))
return a;
else
return b;
}
注意:如果目的之一是不显示列表上,则函数返回null
。您可以将其更改为返回其他对象。
你几乎可以肯定地优化这个,但这是第一次切割。
只是一个使用向量的Manish答案的重构版本,如果您调用较高(a,a.parent),将不会返回奇怪的结果。
父母()可以用于其他用途太:
public function higher(a:DisplayObject, b:DisplayObject):DisplayObject
{
var aParents:Vector.<DisplayObject> = parents(a);
var bParents:Vector.<DisplayObject> = parents(b);
var commonDepth:int = Math.min(aParents.length, bParents.length);
for (var depth:int = 0; depth < commonDepth; depth++)
if (aParents[depth] != bParents[depth])
break;
if (depth == 0 || depth == commonDepth)
return null;
var commonAncestor:DisplayObjectContainer = aParents[depth].parent;
if (commonAncestor.getChildIndex(aParents[depth]) > commonAncestor.getChildIndex(bParents[depth]))
return a;
else
return b;
}
private function parents(d:DisplayObject):Vector.<DisplayObject>
{
var result:Vector.<DisplayObject> = new Vector.<DisplayObject>;
while (d != null)
{
result.unshift(d);
d = d.parent;
}
return result;
}
这是一个什么样的版本Manish才做完jauboux的修订版。
即,当深度匹配时,从highestOf()
添加null
返回值。
/**
* @param ifDepthsMatchReturnObjectA
* @return Whichever DisplayObject is higher on the display list.
* Optionally returns `null` if they're at the same depth.
*/
public function highestOf(a:DisplayObject, b:DisplayObject, ifDepthsMatchReturnObjectA:Boolean = false):DisplayObject
{
var aParents:Vector.<DisplayObject> = ancestorsOf(a);
var bParents:Vector.<DisplayObject> = ancestorsOf(b);
var commonDepth:int = Math.min(aParents.length, bParents.length);
for (var depth:int = 0; depth < commonDepth; depth++)
if (aParents[depth] != bParents[depth])
break;
if (depth == 0 || depth == commonDepth)
return null;
var commonAncestor:DisplayObjectContainer = aParents[depth].parent;
var aDepthOnCommonAncestor:int = commonAncestor.getChildIndex(aParents[depth]);
var bDepthOnCommonAncestor:int = commonAncestor.getChildIndex(bParents[depth]);
if (aDepthOnCommonAncestor > bDepthOnCommonAncestor)
return a;
else if (aDepthOnCommonAncestor < bDepthOnCommonAncestor)
return b;
else
return ifDepthsMatchReturnObjectA ? a : null;
}
/**
* @return Whether a is higher than b.
*/
public function isHigher(a:DisplayObject, b:DisplayObject):Boolean
{
return highestOf(a, b) === a;
}
/**
* @return All ancestors of given display.
*/
private function ancestorsOf(display:DisplayObject):Vector.<DisplayObject>
{
var result:Vector.<DisplayObject> = new Vector.<DisplayObject>;
while (display != null)
{
result.unshift(display);
display = display.parent;
}
return result;
}
你有一个示例,其中“else返回ifDepthsMatchReturnObjectA?a:null;”有用吗?对我来说,这只是死代码,如果深度匹配,它只是意味着一个=== b。我发现只有当a和b没有共同的祖先时才返回null更有用 – jauboux 2014-06-19 12:57:35
- 1. 跟踪深度的对象
- 2. 如何跟踪此对象图深度优先搜索算法的深度?
- 3. 显示DNN堆栈跟踪?
- 4. 如何更改Xcode 6中对象的堆叠顺序?
- 5. SQL顺序堆叠
- 6. 堆栈跟踪:]与根源显示java.lang.NullPointerException
- 7. 重新显示堆栈跟踪窗口
- 8. 如何更改列的堆叠顺序?
- 9. 修改`蛋糕测试`来控制堆栈跟踪深度(Clojure)
- 10. 如何扭转堆叠顺序堆叠面积图使用GGPLOT2
- 11. 如何强制红宝石显示完整的堆栈跟踪?
- 12. 如何在eclipse上显示完整的堆栈跟踪?
- 13. 如何强制解释器显示完整的堆栈跟踪?
- 14. 如何增加Java堆栈跟踪转储的显示行数?
- 15. 如何从Python中的异常对象获取堆栈跟踪?
- 16. 如何堆栈跟踪extlib?
- 17. 追踪在Windbg中创建对象的堆栈跟踪
- 18. 如何在Linux中显示堆栈跟踪?
- 19. Xojo图像堆叠顺序
- 20. 转换和堆叠顺序
- 21. 按顺序在堆叠栏中显示百分比值
- 22. PHP如何跟踪创建的对象?
- 23. 角度巨大的堆栈跟踪
- 24. 跟踪firstResponder对象
- 25. 获取对象或数组的深度
- 26. 跟踪远程调用拉取序列化对象的进度
- 27. 如何跟踪COM对象异常?
- 28. 如何在Android中跟踪3D对象
- 29. linq2sql如何跟踪数据库对象?
- 30. 如何跟踪垃圾收集对象
您可以比较显示对象的子索引,但它只在共享同一个父对象时才起作用。在通用情况下,我建议使用找到两个显示对象的最接近的共同祖先的实现之一,然后比较它们的第一个不常见的祖先索引 – jauboux 2013-07-19 14:12:02