Flex - проблема с ResizeEvent. ИЗМЕНИТЬ РАЗМЕРЫ

У меня есть немного проблемы с моим изменять размеры события... Я создал компонент сам, и этот компонент, в каждом изменяют размеры события, выполняет сложный метод. Вот проблема: Когда я максимизирую или восстанавливаю свое окно, это событие называют несколько раз в реальный короткий промежуток времени, не позволяя достаточному количеству времени к моему методу для выполнения полностью, прежде чем другой запустится... Я хотел бы знать, существует ли так или иначе только выполненного этот метод в конце каждого, изменяют размеры перемещения. Спасибо

9
задан Andre Mariano 22 January 2010 в 18:07
поделиться

3 ответа

Вместо того, чтобы реагировать на ResizeEvent, который будет запускать каждый кадр во время изменения размера (т.е. если вы нажмете на maximize и компонент перерисуется из widh/ehight = 0 в width/height = MaxValue), то событие изменения размера будет запускаться три раза, вы можете "посмотреть" свойства ширины и высоты.

var widthWatch:ChangeWatcher = ChangeWatcher.watch(this, 'widht', resizeHandler)
var heightWatch:ChangeWatcher = ChangeWatcher.watch(this, 'height' resizeHandler)

это, по сути, будет следить за свойствами, аналогично привязке данных, и выполнять resizeHandler всякий раз, когда меняется ширина или высота. Это имеет небольшой недостаток в том, что при одновременном изменении ширины и высоты обработчик будет уволен дважды, но это можно решить с помощью третьей функции, которая выполняет эту работу, которая вызывается вашими обработчиками, если не по расписанию. Код:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete(event)">
<mx:Script>
 <![CDATA[
  import mx.binding.utils.ChangeWatcher;

  private var widthWatch:ChangeWatcher;
  private var heightWatch:ChangeWatcher;
  private var resizeExecuting:Boolean = false;

  private function onCreationComplete(event:Event):void
  {
   widthWatch = ChangeWatcher.watch(this,'width',onSizeChange);
   heightWatch = ChangeWatcher.watch(this,'height',onSizeChange);
  }

  private function onSizeChange(event:Event):void
  {
   if(!resizeExecuting)
    callLater(handleResize);
   resizeExecuting = true;
  }

  private function handleResize():void
  {
   //do expensive work here
   resizeExecuting = false;
  }

  private function stopWatching()
  {
   //invoke this to stop watching the properties and prevent the handleResize method from executing
   widthWatch.unwatch();
   heightWatch.unwatch();
  }

 ]]>
</mx:Script>
</mx:Application>

Я предпочитаю метод наблюдателя изменений, так как он работает после изменения свойств ширины и высоты, в отличие от события изменения размера, которое срабатывает до того, как свойства ширины и высоты обновлены.

20
ответ дан 4 December 2019 в 08:33
поделиться

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

1
ответ дан 4 December 2019 в 08:33
поделиться

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

Вы могли бы сделать это несколькими способами, один из которых я буду планироваться в псевдо-коде ниже:

resizeHandler(resizeEvent):
   if (resizeEventReceived)
       return
   resizeEventReceived = true
   Timer.startIn(30 /*ms*/).withHandler(doResize)

doResize(timerEvent):
    /* do actual resize processing */
    resizeEventReceived = false
3
ответ дан 4 December 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: