2009-03-27 7 views
1

J'ai un projet flexible/as3 dans lequel j'ai un arrière-plan bitmap, puis dessinez des Sprites au-dessus de cet arrière-plan. Il crée une carte et un itinéraire vers des emplacements sur la carte. J'implémente une fonction d'impression pour imprimer cette carte (l'écran flash), puis j'ajoute d'autres informations à la même page. La carte affiche avec une largeur de 800px et une hauteur autour de 480px sur un écran d'ordinateur.Comment imprimer tous les éléments sur la scène avec ActionScript 3.0?

J'ai regardé dans la classe PrintJob dans AS3 et trouvé un moyen d'imprimer un bitmap ou un sprite séparé mais je voudrais vraiment juste créer une capture d'écran du fichier flash, puis enregistrer en tant que PNG. pour afficher séparément sur une nouvelle page avec des informations supplémentaires. Je sais que sauver la capture d'écran en tant que .png est un problème différent, mais si je pouvais comprendre comment capturer la scène en premier lieu le deuxième problème cesserait d'être.

Répondre

1

Vous auriez besoin d'envelopper tout ce qui était sur la scène dans une méthode par exemple Sprite et ensuite passer que Sprite à PrintJob.addPage().

Si vous utilisez Flex, vous pouvez également utiliser la classe FlexPrintJob pour gérer une partie de la disposition et de la pagination pour vous.

+0

Personnellement, je ne suis pas très friand de cette solution. Voir mon alternative ci-dessous. – jpwrunyan

1

J'ai essayé d'imprimer la scène et a trébuché avec beaucoup de problèmes pour faire la scène pour redimensionner correctement, donc j'utiliser une combinaison de solutions, qui implique la conversion de la scène à un bitmap.

Voici ma source:

function PrintStage(evt:MouseEvent) { 
    var printJob:PrintJob = new PrintJob(); 
    var options:PrintJobOptions = new PrintJobOptions(); 
    options.printAsBitmap = true; 
    trace("print called!"); 
    if (printJob.start()) { 
    var printSprite = new Sprite(); 

    var bitmapData:BitmapData = new BitmapData(stage.stageWidth,stage.stageHeight); 
    bitmapData.draw(stage); 
    var screenShot:Bitmap = new Bitmap(bitmapData); 

    printSprite.addChild(screenShot); 

    //========== printjob bug fix - prevent blank pages: ========== 
    printSprite.x = 2000; //keep it hidden to the side of the stage 
    stage.addChild(printSprite); //add to stage - prevents blank pages 
    //============================================================= 

    trace("before printSprite width: " + printSprite.width + " printJob.pageWidth: " + printJob.pageWidth); 

    //scale it to fill the page (portrait orientation): 
    var myScale:Number; 
    myScale = Math.min(printJob.pageWidth/printSprite.width, printJob.pageHeight/printSprite.height); 
    printSprite.scaleX = printSprite.scaleY = myScale; 
    var printArea:Rectangle = new Rectangle(0, 0, printJob.pageWidth/myScale, printJob.pageHeight/myScale); 

    trace("after printSprite width: " + printSprite.width + " printJob.pageWidth: " + printJob.pageWidth); 

    printJob.addPage(printSprite,printArea,options); 
    printJob.send(); 

    stage.removeChild(printSprite); 
    printSprite = null; 
    } 
    } 

aide quelqu'un espère que cela ....

+0

Aucune infraction, mais c'est essentiellement la même chose que la réponse que j'ai fournie, sauf que la vôtre a plus de lignes de code. La différence est que le mien utilise le framework Flex. Donc, le vôtre serait utile dans un projet AS seulement. En outre, vous n'avez pas besoin de "masquer" le contenu hors écran si vous le supprimez dans le même bloc fonctionnel. Personne ne le verra sans un rafraîchissement de l'écran. – jpwrunyan

0

J'ai eu le même problème aujourd'hui. Je suis choqué (choqué!) Qu'Adobe ne vous laisse pas faire une chose aussi simple que d'imprimer la scène. J'ai choisi de créer simplement une image bitmap à partir de l'instance de scène, de l'ajouter à l'instance de l'application, puis de l'imprimer. Je pense que cela est plus simple que d'essayer d'emballer les choses dans un autre composant, de modifier la mise en page, etc. Comme vous n'avez qu'une seule image pour tout l'écran, vous n'avez besoin que de positionner cette image. Si vous utilisez une disposition absolue, aucun positionnement ne devrait même être nécessaire. Cela chevauchera parfaitement votre contenu réel. Imprime l'instance d'application. Supprimez l'instance de conteneur de l'image bitmap et vous avez terminé. Maintenant, il pourrait être possible d'utiliser PrintJob et au lieu de FlexPrintJob pour imprimer la scène avec moins de lignes de code, mais je ne crois pas que l'instance de scène soit un Sprite, donc quelque chose comme ce qui suit est nécessaire.

Cette méthode suppose que "this" est l'application.

private function printScreen():void { 
    var printJob:FlexPrintJob = new FlexPrintJob(); 
    if (printJob.start()) { 
     var bitmapData:BitmapData = new BitmapData(stage.width, stage.height, false); 
     bitmapData.draw(stage); 
     var bitmap:FlexBitmap = new FlexBitmap(bitmapData); 
     //Wrap the bitmap into a class that can be added to the framework display list. 
     //I chose mx:Image arbitrarily. 
     //Really, anything will do as long as it is an IVisualElement 
     //Note that the application's layout is absolute so this image gets 
     //temporarily added on top of the actual application's elements. 
     var image:Image = new Image(); 
     image.source = bitmap; 
     addElement(image); 

     printJob.addObject(this); 

     removeElement(image); 
    } 
    // Send the job to the printer. 
    printJob.send(); 
} 

Il y a une seule limite que je peux penser à cette approche. C'est la contrainte de taille d'image bitmap maximale du flash. Mais pour un moniteur HD, je pense qu'il n'y a pas de problème.

Questions connexes