2012-08-03 1 views
2

Je veux être capable de cahce texte HTML en tant que bitmap, pour une utilisation dans AlivePDF. Mes tests fonctionnent bien avec TextArea ou si le composant est sur la scène ou visible. Mais je veux être capable de croquer des blocs de texte qui ne s'affichent pas nécessairement à l'écran. Est-ce que quelqu'un sait comment faire ça?AS3 bitmapdata.draw sans ajouter à la liste d'affichage/étape

Ce que je ne jusqu'à

public static function rasterizeText(text:String, width:int = 100, height:int = 100, x:int = 0, y:int = 0):BitmapData { 
     var textRenderer:TextArea = new TextArea(); 
     textRenderer.width = width; 
     textRenderer.height = height; 
     textRenderer.htmlText = text; 

     var bitdata:BitmapData = new BitmapData(width, height, true, 0xFF000000) 
     bitdata.draw(textRenderer); 
     return bitdata; 
    } 
+0

Je ne vois pas comment vous pouvez enregistrer une donnée bitmap sans la générer d'abord. Essayez de rendre le texte à un moment donné hors de la scène où il n'est pas visible, puis retirez-le plus tard. – loxxy

Répondre

2

Votre code devrait fonctionner correctement. Il n'est pas nécessaire d'ajouter textRenderer à la scène pour l'intégrer dans BitmapData. Vous dessinez votre textRenderer sur un fond noir solide. Peut-être que votre texte est également noir et c'est pourquoi vous ne pouvez pas le voir?

Essayez de remplacer 0xFF000000 par ex. 0xFFFF0000 et voir si le texte apparaîtra.

+0

cela a-t-il aidé? :) –

+0

Je ne pense pas que ce soit un problème de couleur, cela ne semble fonctionner qu'une fois que je l'ai ajouté à la scène (ci-dessous fonctionne, supprime canvas et dessine pas le renderer) 'public function rasterizeText (texte: String , largeur: int = 100, hauteur: int = 100): BitmapData { \t var textRenderer: TextArea = new TextArea(); \t textRenderer.width = largeur; \t textRenderer.height = hauteur; \t textRenderer.textFlow = TextConverter.importToFlow (text, TextConverter.TEXT_FIELD_HTML_FORMAT); \t \t canvas.rawChildren.addChild (textRenderer); \t \t var bitdata: BitmapData = nouveau BitmapData (largeur, hauteur, false) \t bitdata.draw (canvas); \t renvoyer des données de bits; \t} ' – Lex

1

Non ce n'était pas un problème de couleur. J'ai également eu la couleur réglée à FF000000 qui au moins aurait dû montrer le noir. TextArea n'a pas semblé bien jouer avec les bitmaps, bien que TextField fonctionne parfaitement bien. Editer: Je suppose que TextArea ne fonctionnait pas comme étincelle ou mx parce qu'ils sont une chose FlexSprite, qui agissent différemment des sprites AS3 normaux. Ils différeront le rendu jusqu'à ce qu'ils soient ajoutés à la liste d'affichage.

Fonction de travail:

public function rasterizeText(text:String, 
     width:int = 100, height:int = 100):BitmapData { 
    var tf:TextField = new TextField(); 
    tf.multiline = true; 
    tf.wordWrap = true; 
    tf.width = width; 
    tf.height = height; 
    tf.htmlText = text; 
    var bd:BitmapData = new BitmapData(width, height, true,0x00000000); 
    bd.draw(tf); 
    return bd; 
} 

Ce ne fonctionnait pas (j'ai essayé mx & composants textarea d'allumage):

public function rasterizeText(text:String, 
     width:int = 100, height:int = 100):BitmapData { 
    var textRenderer:TextArea = new TextArea(); 
    textRenderer.width = width; 
    textRenderer.height = height; 
    textRenderer.textFlow = TextConverter.importToFlow(text, TextConverter.TEXT_FIELD_HTML_FORMAT); 
    var bitdata:BitmapData = new BitmapData(width, height, false, 0xFF000000) 
    bitdata.draw(textRenderer); 
    return bitdata; 
} 

Cependant, il travaillerait lors de l'élaboration de la scène:

public function rasterizeText(text:String, 
     width:int = 100, height:int = 100):BitmapData { 
    var textRenderer:TextArea = new TextArea(); 
    textRenderer.width = width; 
    textRenderer.height = height; 
    textRenderer.textFlow = TextConverter.importToFlow(text, TextConverter.TEXT_FIELD_HTML_FORMAT); 
    canvas.addElement(textRenderer); 
    var bitdata:BitmapData = new BitmapData(width, height, false, 0xFF000000) 
    bitdata.draw(canvas); 
    return bitdata; 
} 
Questions connexes