2010-03-30 105 views
3

的内容在一个理智的世界中,这按预期工作:的Flash/AIR AS3:比较Screen.screens

var array:Array = ['a','b','c']; 
trace(array.indexOf(array[0])); // returns 0 

在一个疯狂的世界,出现这种情况:

trace(Screen.screens.indexOf(Screen.screens[0])); // returns -1 

...如果Screen.screensScreen的可用实例的Array,为什么不能给出一个准确的indexOf自己的孩子?

编辑 -要采取这一步,检查了这一点:

Screen.screens上市
for each(var i:Screen in Screen.screens){ 
for each(var j:Screen in Screen.getScreensForRectangle(this.stage.nativeWindow.bounds)){ 
    trace(i, j, i == j); // returns false 
    trace(i.bounds, j.bounds, i.bounds == j.bounds); // returns false 
} 
} 

至少一个Screen应该等同于在Screen.getScreensForRectangle(this.stage.nativeWindow.bounds)Screen - 但即使你比较Screen.bounds,它仍然不匹配,尽管有两个Rectangle对象具有相同的尺寸!

疯狂,女士们,先生们!你甚至不希望看到我放在一起解决方法(提示:它涉及到为Screen.screens内容比较Screen.bounds.toString()值)

+0

我知道,“屏幕,屏幕,屏幕点屏幕点屏幕。”但我想举一个真实的例子。 – 2010-03-30 01:40:53

回答

2

这是一个受过教育的猜测,但因为Screen.screens是只读的,和(?)修改它返回的数组没有任何影响,我认为这是一个相当安全的选择,在内部,每次调用Flash时,都会生成并返回一个新的对象数组(而不是保留一组内部的Screen对象并允许您访问它们)。当您拨打:

Screen.screens.indexOf(Screen.screens[0]) 

你让两个独立的访问Screen.screens,所以如果每个这些调用的返回一个不同的对象数组,很容易看出为什么你没有找到任何匹配 - 因为indexOf方法测试===相等,所以两个不同的Screen对象将不匹配,即使它们碰巧包含关于相同物理屏幕的信息。

解决方案是获取屏幕数组的副本并使用它。这工作正常:

var scr:Array = Screen.screens; 
trace(scr.indexOf(scr[0])); // returns 0 
+0

不错 - 我敢打赌,你完全正确,那就是发生了什么。这是否遵循某种标准做法,我想知道?因为虽然只读数组的部分是有意义的,但我希望它是一个数组,每当屏幕更改时在幕后更新,而不是在每次请求时重新构建数组......无论如何,谢谢,这正是我想要的。 – 2010-03-30 08:11:54

+0

我认为在测试对象的平等性时通常要小心...... API是否提供了对上次同一对象的引用,或者是一个新对象,最终是API实现的一个细节,它总是最安全的不要依赖于。 毕竟,你并不关心你是否有两个引用同一个对象,你关心的是他们是否指向同一个物理屏幕......在这种情况下很难确定,但语义上你明白我的意思。 ;) – fenomas 2010-03-30 10:13:01

+0

但是为了回答你的问题,通常我会猜想像Screen这样的东西只是一个信息性质的块,可能是一个一扔的对象。类似于NativeApplication.openedWindows,它为您提供非常复杂的NativeWindow对象,可能更可能引用持久对象。经过快速测试后,它看起来就像它一样。但最好不要依靠它,如果你能避免它,当然.. – fenomas 2010-03-30 10:23:25