PDA

Просмотр полной версии : Реализация alwaysOnTop для DisplayObjecta


mayakwd
24.02.2010, 17:26
Вопрос вполне себе глупый, хочется изящного решения. Я не нашел ни одного эвента (поднимите мне веки) который отвечал бы за смену позиции объекта в дисплейлисте.

Простым решением было бы создать класс в котором будет один энетрфрейм и список объектов, который пополняется пользователем, на энтерфрэйм естественно проверяется на какой глубине лежат объекты, и в случае если они находятся не на самой высшей позиции перекинуть их туда.

Вопрос: есть ли более изящное решение для такой ситуации?
Вопрос на вопрос ("зачем?") не актуален.

Obi
24.02.2010, 18:12
class SmartContainer extends DisplayObjectContainer {
private var _onTopObj:DisplayObject;

override public function addChild(child:DisplayObject):DisplayObject {
if(_onTopObj && contains(_onTopObj)) {
if(child !== _onTopObj) {
super.addChildAt(child, getChildIndex(_onTopObj))
}
}else {
super.addChild(child);
}
return child;
}
}



Как-то так, если уж прям нестерпимо хочется автоматизировать.

UPD: Но уж никак не ENTER_FRAME.

Gaen
24.02.2010, 18:14
Еще можно перекрыть методы DisplayObjectContainer, которые меняют позицию объекта в дисплейлисте (addChild, addChildAt, removeChild, removeChildAt, setChildIndex, swapChildren, swapChildrenAt)

mayakwd
24.02.2010, 18:32
вы мне и stage предлагаете переписать? это далеко не изящное, а частное решение.

Obi
24.02.2010, 18:44
вы мне и stage предлагаете переписать? это далеко не изящное, а частное решение.

>> вы мне и stage предлагаете переписать
Нет, для этого есть класс SmartContainer, который можно добавить на stage.

>> это далеко не изящное, а частное решение
Любое решение — частное. Особенно то, которое не предусмотрено API. Вы хотите чтобы все автоматически работало как надо? Так не бывает, смиритесь.

mayakwd
24.02.2010, 18:51
Вы не правы. Область видимости должна быть независимой.
Поэтому удобнее использовать тот способ который описал я. Взамен энтерфэйма может быть таймер.

Решение которое предложил я универсальное, поэтому обойдемся без громких слов.
И пожалуйста не надо меня поучать, я вполне компетентен, чтобы решить с чем смириться, а с чем нет.

У кого еще есть идеи?
И да пожалуйста не надо стараться изменить задачу.

Rzer
24.02.2010, 19:05
var top:DisplayObject;

addEventListener(Event.ADDED, onSomethingAdded);

private function onSomethingAdded(e:Event):void {

if(!top){
return;
}

//Событие пузырьковое (отслеживаем события только из подписанного контейнера)
if (e.target == e.currentTarget){
if (contains(top)){
setChildIndex(top, numChildren-1);
}
}
}


Вроде так должно сработать, хотя не отловит тот же самый setChildIndex