2009-02-25 5 views
1

Je construis une animation en flash et as3, j'ai une fonction dans laquelle j'ajoute une étape eventListener, stage.addEventListener (Event.ENTER_FRAME, setScrollPercent, false, 0, vrai);flash AS3 comment puis-je supprimer les écouteurs d'événements de scène

Étant donné que cet événement est défini dans une fonction d'une fonction, "deux fonctions profondes", comment puis-je réinitialiser tous les écouteurs d'événement de l'extérieur des fonctions sans erreur?

Répondre

5

Les meilleures pratiques avec AS EventListeners sont:

  • Faites faible (comme vous l'avez fait, le dernier paramètre de addEventListener)
  • Réglez l'écouteur d'événement null après manipulation (stricto sensu pas nécessaire si vous l'avez configuré pour être faible)

Flex ne vous donne pas de destructeurs. Il a son propre Garbage Collector qui exécute les coulisses de la gestion de la mémoire. Il nettoie un morceau de mémoire une fois qu'il n'y a aucune référence. Eh bien, de fortes références. Tous les objets par défaut ont une référence forte. Les gestionnaires d'événements, car ils ont tendance à être un goulot d'étranglement des performances, ont cette capacité spéciale de se déclarer faibles - une référence faible. Ceci n'est bien sûr possible que lorsque vous associez les gestionnaires d'événements à l'aide de la fonction addEventHandler(). Les références faibles ne sont pas prises en compte par le GC et, par conséquent, quand toutes les références fortes ont disparu, elles seront collectées automagiquement, ce qui vous libère de la tension d'avoir à faire un =null manuellement. Ce qui est ce que vous feriez sinon lorsque vous ne spécifiez pas le paramètre. Par défaut, même les gestionnaires sont créés en tant que références fortes. Toutefois, les marquer comme faibles a un effet secondaire. Ils peuvent disparaître dans l'air sans que vous le sachiez. Finalement, vous le saurez, mais en termes d'un bug méchant. Est-ce ce qui cause vos problèmes? Peut-être peut-être pas. Vous devrez expérimenter. En outre, il sera utile si vous pouvez nous fournir plus de détails comme le code d'erreur exact, une source.

Espérons que cela aide. Bonne flexion :)

+0

pouvez-vous ajouter un exemple? Je suis nouveau à AS3 et je ne sais vraiment pas ce que signifie faible. –

1

Quelles sont les erreurs que vous voyez? Le niveau d'imbrication ne doit rien avoir à faire avec, puisque les écouteurs sont juste enregistrés par les paramètres, donc tant que vous appelez remove avec les mêmes trois paramètres clés que vous avez utilisés pour ajouter, vous devriez vous débrouiller. Est-ce que votre véritable question est de savoir comment obtenir une référence à l'objet écouteur sur la portée extérieure? Si oui, il existe plusieurs solutions possibles et la meilleure façon de le faire dépend de la structure de votre code.

- MarkusQ

0

La réponse à votre question, et je réalise que vous avez eu un problème avec la portée, parce que je viens de répondre à une question que vous aviez sur la portée, c'est que vous travaillez avec la scène. Considérez la scène globale comme la toile dans laquelle tous vos objets d'affichage sont dessinés.

Ce qui suit fonctionnera partout !!!

stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true); 

Maintenant, l'erreur que vous parlez, IM DEVINER, est que vous définissez simplement ci-dessus à removeEventListener quand vous étiez prêt qui ne fonctionnera pas. La fonction removeEventListener N'ACCEPTE PAS cinq paramètres comme son addEventListener frère, elle n'autorise que trois priorités ignorantes et une référence faible, comme le montre l'exemple suivant.

//The following removes YOUR stage Event.ENTER_FRAME listener from any scope. 
stage.removeEventListener(Event.ENTER_FRAME, setScrollPercent, false); 

espérons que cette aide, rappelez-vous cette étape est la racine globale dans un sens, et faire attention de la racine, il fonctionne réellement comment il est censé maintenant dans le fait que l'appel racine est maintenant par rapport à la swf vous appelez-le, pas la scène, sauf si la scène est la racine de la portée actuelle.

0

Vous devriez pouvoir utiliser votre ancienne fonction et utiliser removeEventListeners au lieu d'ajouter. Assez simple en fait.

Questions connexes