Bonjour,
Je suis en train de développer un lecteur de flux de caméra, et j'ai un petit pb de data binding. J'ai 2 composants, un lecteur de flux MJPG et une image "améliorée" (code en fin de post pour la lisibilité) :
- Le lecteur change sa propriété lastImage chaque fois qu'une nouvelle image est disponible, et génère un événement ReaderEvent.
- Mon image "améliorée" dérive de mx:image, elle utilise un Loader pour précharger et décoder l'image générée par le reader et éviter ainsi le clignottement.
Ce que je voudrais pouvoir écrire :
où img fournit un setter (voir plus bas le code) qui va se charger de donner les data au Loader au lieu de les envoyer directement à l'image.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <my:CameraReader id="reader" host="..." port="..."/> <my:EnhancedImage id="img" source={reader.lastImage} />
Seulement voilà... ça ne fonctionne pas. Je n'ai rien qui s'affiche, il semble que le dataBinding ne se fasse pas. Si par contre je n'override pas le setter de img.source, mais que je crée une nouvelle property publique dataSource (code du setter identique, juste remplacer source par dataSource), ça fonctionne. Bien sur, si j'intercepte le ReaderEvent (cf code) et que je fais le chargement à la main, ça fonctionne.
Quelqu'un a une idée ?
---------------
Reader.as :
EnhancedImage.mxml :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 [Bindable] public var lastImage: ByteArray = null; .... var event: ReaderEvent = new ReaderEvent( image ); lastImage = image; dispatchEvent( event );
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <mx:Image ...> <mx:Script> <![CDATA[ private var _loader: Loader = new Loader(); override public function set source( dataSource: Object ):void { if( null != dataSource && dataSource is ByteArray ) { var array: ByteArray = dataSource as ByteArray; if( array.bytesAvailable > 0 ) _loader.loadBytes( array ); } } private function onBytesLoaded( e:Event ): void { this.data = _loader.content; } ...
Partager