2009-07-06 2 views
1

Когда компонент Flex перемещается напрямую, так что его свойства x и y изменяются, на событие отправляется событие «move». Все в порядке.В Flex, как я могу обнаружить, когда компонент перемещается?

Однако компонент может также перемещаться в результате перемещения его родительского компонента - или его перемещение родителя и т. Д. Теперь, когда движется родительский компонент, его дети просто «перемещаются» без каких-либо свойств, изменяя или перемещая события, отправляемые на детей. Тем не менее, дети движутся по экрану. Итак, как вы можете обнаружить такое обобщенное движение?

ответ

1

Один из способов заключается, чтобы захватить все события перемещения в приложении:

Application.application.addEventListener 
    (MoveEvent.MOVE, handleMove, true, 0, true); 

Третий аргумент является обязательным, поскольку перемещение событий не пузырь, и поэтому вместо того, должны быть захвачены. Четвертый аргумент неважен, и пятый аргумент включает слабые ссылки, что является хорошей идеей в этом случае, потому что мы создаем глобальную ссылку из Application.application to handleMove - рецепт утечек памяти.

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

Тем не менее, было бы неплохо иметь более чистый способ решить эту проблему.

0

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

private function addHandlerToStationaryParent(handler:function):void 
{ 
    var currentParent:DisplayObjectContainer = parent; 
    while(currentParent != null) 
    { 
     if(currentParent["stationary"] == true) 
     { 
      currentParent.addEventListener(MoveEvent.MOVE, handler); 
      return; 
     } 
    } 
} 

Я думаю, это было бы вашим преимуществом относительно того, будет ли это лучшим решением.

+0

Вам все равно придется передавать истину в качестве третьего аргумента addEventListener, чтобы включить захват. Кроме того, было бы лучше добавить слушателя событий к непосредственному ребенку неподвижного предка - иначе вы рискуете поймать события у нерелевантных детей неподвижного предка. –

+0

Ну, я просто демонстрировал точку. – CookieOfFortune

Смежные вопросы