Просмотр полной версии : Реализация alwaysOnTop для DisplayObjecta
Вопрос вполне себе глупый, хочется изящного решения. Я не нашел ни одного эвента (поднимите мне веки) который отвечал бы за смену позиции объекта в дисплейлисте.
Простым решением было бы создать класс в котором будет один энетрфрейм и список объектов, который пополняется пользователем, на энтерфрэйм естественно проверяется на какой глубине лежат объекты, и в случае если они находятся не на самой высшей позиции перекинуть их туда.
Вопрос: есть ли более изящное решение для такой ситуации?
Вопрос на вопрос ("зачем?") не актуален.
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.
Еще можно перекрыть методы DisplayObjectContainer, которые меняют позицию объекта в дисплейлисте (addChild, addChildAt, removeChild, removeChildAt, setChildIndex, swapChildren, swapChildrenAt)
вы мне и stage предлагаете переписать? это далеко не изящное, а частное решение.
вы мне и stage предлагаете переписать? это далеко не изящное, а частное решение.
>> вы мне и stage предлагаете переписать
Нет, для этого есть класс SmartContainer, который можно добавить на stage.
>> это далеко не изящное, а частное решение
Любое решение — частное. Особенно то, которое не предусмотрено API. Вы хотите чтобы все автоматически работало как надо? Так не бывает, смиритесь.
Вы не правы. Область видимости должна быть независимой.
Поэтому удобнее использовать тот способ который описал я. Взамен энтерфэйма может быть таймер.
Решение которое предложил я универсальное, поэтому обойдемся без громких слов.
И пожалуйста не надо меня поучать, я вполне компетентен, чтобы решить с чем смириться, а с чем нет.
У кого еще есть идеи?
И да пожалуйста не надо стараться изменить задачу.
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
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.