Как узнать, появляется ли всплывающее окно на экране в flex - PullRequest
1 голос
/ 11 июля 2011

Мне нужно знать, отображается ли на экране всплывающее окно (которое представляет собой одноэлементное окно заголовка, следовательно, будет инициализировано только один раз) или нет, если нет, то я вызову функцию, чтобы показать его, в противном случае сделайте что-то еще.

Я пытался найти findPopup.focusEnabled // findPopup - это класс titlewindow для всплывающего окна

Но это всегда верно независимо от того, отображается ли всплывающее окно на экране в настоящее время или нет.1006 * Спасибо.

Ответы [ 4 ]

3 голосов
/ 11 июля 2011

Использовать isPopUp

Установить PopUpManager в значение true, чтобы указать, что компонент был активирован.

2 голосов
/ 11 июля 2011

Все объекты, отображаемые на экране, имеют свойство root:DisplayObject. Если он будет удален с экрана, то root будет нулевым Если вы беспокоитесь о том, находится ли всплывающее окно перед всем остальным, используйте popUpObj.parent.setChildIndex(popUpObj, popUpObj.parent.numChildren - 1), чтобы убедиться в этом (подробнее об этом ниже). Вам нужно будет перебирать всех родителей, пока вы не достигнете самого root. (С помощью PopUpManager я считаю, что MovieClip добавляется непосредственно в root, поэтому он должен быть только один раз, но сейчас я не помню)

Все остальное очевидно:

  • это альфа = 1?
  • видимый = правда?
  • ширина> 5
  • высота> 5
  • ... Я мог бы продолжить, но я думаю, что идея довольно ясна.

При проверке видимости затененных объектов:

Честно говоря, это проще всего сделать на root.

var firstParent:DisplayObjectContainer = /* 
                                            find the ancestor which is on 
                                            the root. You may need to look up 
                                            "path to root AS3"
                                         */
var num:int = root.numChildren;
//iterate backwards to exclude things below the target clip.
for( var i:int = num - 1; i >= 0; i-- )
{
     var kid:DisplayObject = root.getChildAt( i );
     if( kid == firstParent ) break; // no sense in continuing.
     if( firstParent.hitTestObject( kid ) )
     {
         // kid at least partially obscures the pop-up. Do something with it.
     }
}
0 голосов
/ 11 июля 2011

[Edit:]

Не знал, что вы используете PopUpManager. Пожалуйста, используйте ответ Ранхиру Курей.

Напоминание о том, что PopUpManager имеет свой собственный метод для размещения всплывающего окна перед всеми другими объектами: bringToFront(popup)

[/ Edit]

Вы пытаетесь выяснить, было ли всплывающее окно добавлено на сцену или оно все еще действительно видно на экране и не скрыто за другими экранными объектами?

Если это первое, вы можете узнать с помощью поиска (flex 3)

// popUpContainer is the object containing the pop up
if (popUpContainer.contains(FindPopup.getInstance()))
{
      // The popup was added to stage
}
else
{
      popUpContainer.addChild(FindPopup.getInstance());
}

Если это второе, вы можете убедиться, что оно видно, добавив его в корень приложения и убедившись, что оно имеет самый высокий индекс. Но трудно проверить, действительно ли он отображается на экране, поскольку он может быть скрыт на 40% или 60% за другими объектами.

// Placing the pop up on top of other display objects in the application root
this.setChildIndex(FindPopup.getInstance(), this.numChildren - 1);
0 голосов
/ 11 июля 2011

Вы можете проверить, существует ли объект с помощью блока if

if(findPopup)
findPopUp.visible=true;

при условии, что вы отключили видимость, чтобы скрыть окно. Конечно, вы можете уничтожить объект и воссоздать его, если хотите. В этом случае вам не нужен блок if, потому что он будет восстановлен с нуля.

Вы все еще можете использовать эту логику, чтобы быть уверенным, что где-то в вашем коде что-то уже создало ваш всплывающий объект. Может быть, другой класс будет делать это за кулисами, поэтому основная идея состоит в том, чтобы гарантировать, существует ли такой объект или нет.

...