Flash / AIR AS3:比较Screen.screens的内容

时间:2010-03-30 01:24:56

标签: flash actionscript-3 air screen desktop-application

在一个理智的世界中,这可以按预期工作:

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

在疯狂的世界中,会发生这种情况:

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

...如果Screen.screensArray的可用实例的Screen,为什么该数组不能给出自己的孩子准确的indexOf个?

修改要更进一步,请查看以下内容:

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.screens应与Screen中的Screen.getScreensForRectangle(this.stage.nativeWindow.bounds)相同 - 但即使您比较Screen.bounds,它仍然不会尽管两个Rectangle对象具有相同的尺寸,但仍然不匹配!

精神错乱,女士们,先生们!您甚至不希望看到我放在一起的解决方法(提示:它涉及比较Screen.bounds.toString()的内容Screen.screens的值}

1 个答案:

答案 0 :(得分:2)

这是一个受过教育的(?)猜测,但由于Screen.screens是只读的,并且修改它返回的数组没有效果,我认为这是一个相当安全的赌注,在内部,每次调用它时Flash生成并返回一个新的Screen个对象数组(而不是保留一组内部的Screen个对象,并允许您访问它们)。当你打电话:

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

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

解决方案是获取屏幕数组的副本并使用它。这很好用:

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