2010-03-30 41 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