IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Flex Discussion :

Peindre un composant dans une bitmap


Sujet :

Flex

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Par défaut Peindre un composant dans une bitmap
    Boujour à tous,

    Je cherche à peindre un de mes composants dans une Bitmap. Pour ça, j'ai essayé d'utiliser la méthode BitmapData.draw(myComp,...) (ou ImageSnapshot.captureBitmapData(...), ce qui revient à peu près au même). Mon problème, c'est que code ne semble fonctionner qu'avec des composants "actifs", c'est à dire déjà intégrés dans l'arborescence de composants de mon application. En gros, je voudrais être capable de faire la chose suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var label:Label = new Label();
    label.text = "toto";
    label.width = 40;
    label.height = 40;
    // ...
    var bitmapData:BitmapData = new BitmapData();
    bitmapData.draw(label);
    Pour avoir essayé ce type de code avec une de mes classes, j'ai pu voir que la méthode updateDisplayList de mon composant n'était même pas appelée, ce qui explique pourquoi la bitmap reste désespérement vide.

    Je me demandais donc si ce que j'essaie de faire est impossible ou s'il est possible d'ajouter un quelconque code pour rendre le label "renderable".

    Merci d'avance,

    Pierre.

  2. #2
    Membre Expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Par défaut
    euh... quand tu dis peindre ton composant, c'est juste le colorer??

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Par défaut
    Citation Envoyé par Jim_Nastiq Voir le message
    euh... quand tu dis peindre ton composant, c'est juste le colorer??
    Désolé, c'est toujours la terminologie java qui me vient à l'esprit ("paintComponent"). En gros, "peindre" mon composant signifie convertir l'information vectorielle qu'il représente en une image (BitmapData). Tous les exemples que j'ai vus fonctionnaient avec des DisplayObjects (qu'ils soient UIComponents ou simples Sprites) qui étaient affichés à l'écran au moment de la capture, ce qui n'est pas la fonctionnalité que je recherche.

    Je travaille en ce moment sur la génération d'un rapport (une série de petits graphiques que j'ai développés moi-même sous la forme de sous-classes de UIComponent) au format pdf. Pour cela, j'ai besoin de générer des images de mes graphiques pour les insérer dans le fichier pdf, sachant que ces graphiques ne sont pas nécessairement affichés à l'écran au moment de l'écriture du pdf.

    Pierre.

  4. #4
    Membre Expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Par défaut
    il faut lui passer la taille du composant non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bmp = new BitmapData (tonLabel.width, tonLabel.height);
    bmp .draw(tonLabel);

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Par défaut
    [QUOTE=Jim_Nastiq;3331871]il faut lui passer la taille du composant non?
    Désolé (encore ), j'ai juste oublié de retranscrire ce détail dans mon post. Je l'avais fait dans mon code...

    J'ai fait un petit programme pour bien illustrer ce qui se passe :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    	<mx:Script>
    		<![CDATA[
    			private function onResetImage(event:MouseEvent):void {
    				image.source = null;
    			}
     
    			private function onTest1(event:MouseEvent):void {
    				var bitmapData:BitmapData = new BitmapData(firstLabel.width, firstLabel.height);
    				bitmapData.draw(firstLabel);
    				var bitmap:Bitmap = new Bitmap(bitmapData);
    				image.source = bitmap;
    			}
     
    			private function onTest2(event:MouseEvent):void {
    				var label:Label = new Label();
    				label.text = "toto";
    				label.width = firstLabel.width;
    				label.height = firstLabel.height;
    				/*
    				J'ai essayé ici toute sorte de code :
    				- les différentes méthodes invalidate***,
    				- la méthode prepareToPrint,
    				- modifier les styles...,
    				- les méthodes move, setActualSize,
    				- toutes les méthodes agissant sur la taille.
    				*/
    				var bitmapData:BitmapData = new BitmapData(firstLabel.width, firstLabel.height);
    				bitmapData.draw(label);
    				var bitmap:Bitmap = new Bitmap(bitmapData);
    				image.source = bitmap;
    			}
     
    			private function onTest3(event:MouseEvent):void {
    				var shape:Shape = new Shape();
    				shape.x = 0;
    				shape.y = 0;
    				shape.graphics.lineStyle(1, 0, 1);
    				shape.graphics.drawCircle(10, 10, 10);
    				var bitmapData:BitmapData = new BitmapData(60, 60);
    				bitmapData.draw(shape);
    				var bitmap:Bitmap = new Bitmap(bitmapData);
    				image.source = bitmap;
    			}
    		]]>
    	</mx:Script>
    	<mx:Image x="40" y="36" width="185" height="135" id="image"/>
    	<mx:Label x="301" y="38" text="toto" id="firstLabel" opaqueBackground="0xFFFFFF"/>
    	<mx:Button x="233" y="36" label="Test 1" click="onTest1(event)"/>
    	<mx:Button x="233" y="66" label="Test 2" click="onTest2(event)"/>
    	<mx:Button x="233" y="96" label="Test 3" click="onTest3(event)"/>
    	<mx:Button x="233" y="126" label="Reset" click="onResetImage(event)"/>
    </mx:Application>
    Ce test montre que :
    - (test 1) : pour un label existant (firstLabel), ça marche
    - (test 2) : pour un label (ou tout autre UIComponent, apparemment) créé à la volée, ça ne marche pas.
    - (test 3) : pour un objet de type Shape créé à la volée, ça marche.

    Il en ressort donc, qu'en l'absence d'un code "magique" que j'ignore, les instances de UIComponent ne peuvent pas être "rendues" immédiatement après leur création si elles ne sont pas ajoutées à l'application.

    Pierre.

  6. #6
    Membre Expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Par défaut
    As tu essayé de catché l'événement creationComplete de ton Label et dans ton handler ajouter ta mécanique. Je soupconne un soucis de composant pas réellement créé au moment de ton coup de pinceau

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 31
    Par défaut
    Je confirme juste mon post précédent avec cette petite modification sur la méthode onTest3 :
    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
    20
    21
    22
    23
    24
    25
    26
     
    private function onTest3(event:MouseEvent):void {
    	var sprite:Sprite = new Sprite();
    	var textField:TextField = new TextField();
    	textField.text = "toto";
    	textField.x = 0;
    	textField.y = 15;
    	sprite.addChild(textField);
    	var label:Label = new Label();
    	label.text = "toto 2";
    	label.x = 0;
    	label.y = 30;
    	label.width = 20;
    	label.height = 10;
    	sprite.addChild(label);
    	var shape:Shape = new Shape();
    	shape.x = 0;
    	shape.y = 0;
    	shape.graphics.lineStyle(1, 0, 1);
    	shape.graphics.drawCircle(10, 10, 10);
    	sprite.addChild(shape);
    	var bitmapData:BitmapData = new BitmapData(60, 60);
    	bitmapData.draw(sprite);
    	var bitmap:Bitmap = new Bitmap(bitmapData);
    	image.source = bitmap;
    }
    Ca marche aussi pour les Sprites et les TextFields mais pas pour le Label ajouté au Sprite, ce qui confirme l'hypothèse que le problème ne concerne que les UIComponents.

    Pierre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Swing] Remplacement d'un composant dans une Frame
    Par SheikYerbouti dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 20/02/2006, 15h51
  2. Réponses: 1
    Dernier message: 13/01/2006, 19h37
  3. Comment passer dans une Bitmap un champs BLOB ?
    Par colorid dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/01/2006, 08h56
  4. Réponses: 2
    Dernier message: 09/08/2005, 08h51
  5. Disposition de composants dans une JFrame
    Par Regis.C dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 21/03/2005, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo