Flash / AIR AS3: сравнение содержимого Screen.screens - PullRequest
3 голосов
/ 30 марта 2010

В нормальном мире это работает как ожидалось:

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

В безумном мире это происходит:

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

... если Screen.screens является Array из доступных экземпляров Screen, почему этот массив не может дать точного indexOf одного из своих собственных потомков?

edit - Чтобы сделать шаг вперед, проверьте это:

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 Ответ

2 голосов
/ 30 марта 2010

Это обоснованное (?) Предположение, но поскольку 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...