9
votes

Flex - problème avec resizeevent.Resize

J'ai un petit problème avec mon événement de redimensionnement ... J'ai créé un composant moi-même, ainsi que ce composant, à chaque événement de redimensionnement, exécute une méthode complexe. Voici le problème: lorsque je maximisez ou restaurez ma fenêtre, cet événement est appelé plusieurs fois dans une courte période réelle, ce qui ne laisse pas suffisamment de temps à ma méthode pour courir complètement avant que celui-ci ne commence ... j'aimerais savoir S'il y a de toute façon seulement exécuter cette méthode à la fin de chaque mouvement de redimensionnement. Merci


0 commentaires

4 Réponses :


3
votes

Vous voudrez coalser les événements de redimensionnement en un seul événement. David Coletta a brièvement parlé de l'événement de coalescence dans Cette présentation , mais je ne me souviens pas s'il décrit comment il l'a fait.

Vous pouvez le faire de différentes manières, dont une mise en page en pseudo-code ci-dessous: xxx


0 commentaires

1
votes

Cela me semble que vous faites quelque chose dans votre gestionnaire d'événements qui causent une nouvelle resizeVant.Resize à tirer. Étant donné que ActionScript fonctionne dans un seul thread, aucune source indépendante ne pourrait éventuellement être envoyé cet événement pendant que votre gestionnaire est en cours d'exécution, à moins que vous ne le déclenche en quelque sorte.


0 commentaires

20
votes

au lieu de réagir à un resizeEvent, qui déclenchera chaque image pendant un redimensionnement (c'est-à-dire si vous appuyez sur Maximize et qu'il faut 3 images pour le composant pour redessiner de WIDH / EHight = 0 à la largeur / hauteur = maxvalue) puis le redimensionnement) L'événement tirera trois fois, vous pouvez «regarder» les propriétés de la largeur et de la hauteur.

<?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>


2 commentaires

En tant qu'addon à cela, j'effectue beaucoup ce problème pour nos composants de cartographie à Dedoide, rupture de votre fonctionnement complexe avec GreeHreading ( code.google.com/p/greenthreads ). Gardez une poignée sur votre GreeHread actuel, et si ce n'est pas complet, vous pouvez l'arrêter au milieu de la moyenne afin de redémarrer. Cela permet une excellente réactivité de l'UI et de traiter des calculs complexes sur le redimensionnement en même temps.


la largeur devrait être très probablement la largeur



1
votes

Je tiens à souligner que Flex a un cycle de vie complet composant qui pourrait vous aider:

Essayez ceci:

  1. Ne calculez pas directement vos modifications d'écran, mais faites-la dans la méthode UpdateDisplayListList.
  2. Lors de la réception du resizeEvent, appelez uniquement la méthode InvalidateDisplayList (), qui définit un drapeau de framework qui déclenchera l'exécution de la mise à jour UpdateDisplayList ()

    Vous pouvez en savoir plus sur le cycle de vie Flex3 Composant ici: http://www.dlgsoftware.com/primers/primer_on_flex3_component_lifecycle.htm


0 commentaires