2009-10-14 7 views
0

Toute personne qui sait comment faire cela m'aiderait vraiment.événement de notification de changement visuel?

Peut-être que c'est simple, je ne sais pas, mais cela implique des fichiers SWF intégrés, donc j'imagine que cela pourrait entraîner une interaction avec des gestionnaires d'événements ou des méthodes dans un fichier SWF intégré.

Mais de toute façon, voici:

J'ai plusieurs swf embarqués sur une toile (en SWFLoaders) et quand l'un d'eux change visuellement je dois savoir que l'on a changé.

L'événement « rendu » fournit seulement une partie de la solution:

Si un SWFLoader contient un vidéoimage il y a des événements générés continue rendu dans l'application parent alors que vidéoimage est en cours d'exécution. Si le SWFLoader contient juste un contrôle d'entrée statique otoh, il n'y a pas de messages de rendu dans l'application parente jusqu'à ce que quelqu'un interagisse avec ce contrôle et le modifie visuellement, puis des événements de rendu sont diffusés dans l'application parente. Donc, cela fait clairement partie de mes exigences.

Le problème avec le rendu événement cependant, est qu'il ne pas vous dire qui SWF incorporé réellement changé (dans la cible ou currentTarget.)

Mais je dois savoir que l'on a changé.

(Y at-il séparé render les messages générés au sein une application embarquée (séparée de ceux dans l'application parent), par exemple, qui pourrait être détectée.)

+0

est le changement de l'état de rendu la seule chose qui va être en mesure de vous dire qui est actif? ou le changement de rendu est-il toujours activé par une interaction de l'utilisateur? – longstaff

+0

L'événement render est la seule chose que je connaisse, qui se rapproche même grossièrement de ce dont j'ai besoin. Mais comme je l'ai dit, il ne dit pas quel élément intégré a changé ce dont j'ai besoin, il ne fait que détecter qu'il a changé. Mais ce n'est pas déclenché par l'interaction de l'utilisateur en tant que tel, mais par un changement visuel à un contrôle. Je pense que c'est dû à des contrôles appelant stage.invalidate(). Mais de toute façon, j'ai trouvé une solution qui fonctionne pour moi, donc je vais juste poster comme une réponse ci-dessous et la fermer, parce que personne ne sait même de quoi je parle évidemment. – Mark

Répondre

1

Ma solution est la suivante:

Quand un événement de rendu se produit, je vérifie s'il y a un swfloader visible dans la fenêtre du navigateur, puis je fais un BitmapData.draw de son contenu vers un bitmapdata qui est sauvegardé. Avec chaque nouvel événement de rendu, je compare 10% des pixels du bitmap sauvegardé au nouveau bitmap et cela me dira si oui ou non le contenu visuel .swf incorporé a réellement changé. un échantillon de 10% est avéré être plus que suffisant (juste à travers les vecteurs itérer des 10, au lieu de 1. bitmaps respectifs avec l'indice de vecteur par incrémenter)


BitmapData.draw est beaucoup rapide et itérer 10000 éléments vectoriels sont comme une milliseconde.

+0

C'est probablement la meilleure réponse. –

+0

Eh bien, c'est interesing vous diriez que c'était "le meilleur". Je pensais que c'était "assez bon" et du dicton: "Le meilleur est l'ennemi du bien". J'ai eu la vision d'un tunnel pendant quelques jours, malheureusement, sur la façon dont je voulais faire cela, donc je ne pouvais pas voir d'autres solutions. – Mark

+0

Il est peut-être plus rapide de dessiner la deuxième bitmapdata sur la première avec un mode de mélange de différences, puis de faire un getColorBounds pour voir si des pixels ne sont pas noirs. – sharvey

Questions connexes