2009-03-27 6 views
1

Ich habe ein Flex/As3-Projekt, in dem ich einen Bitmaphintergrund habe, und zeichne Sprites über diesem Hintergrund. Es erstellt eine Karte und eine Route zu Orten auf der Karte. Ich implementiere eine Druckfunktion, um diese Karte (den Flash-Bildschirm) zu drucken und dann andere Informationen zu derselben Seite hinzuzufügen. Die Karte wird auf einem Computerbildschirm mit einer Breite von 800 Pixeln und einer Höhe von etwa 480 Pixeln angezeigt.Wie drucken Sie alle Elemente auf der Bühne mit ActionScript 3.0?

Ich habe in der PrintJob-Klasse in AS3 gesucht und eine Möglichkeit gefunden, eine separate Bitmap oder ein Sprite zu drucken, aber ich möchte nur eine Screenshot der Flash-Datei erstellen und dann als PNG speichern. separat auf einer neuen Seite mit zusätzlichen Informationen anzeigen. Ich weiß, dass das Speichern der Bildschirmaufzeichnung als .png ein anderes Problem ist, aber wenn ich herausfinden könnte, wie man die Bühne überhaupt aufnimmt, wäre das zweite Problem nicht mehr.

Antwort

1

Sie müssten alles, was in einer Sprite-Instanz auf der Bühne war, umbrechen und dann den Sprite an die Methode PrintJob.addPage() übergeben.

Wenn Sie Flex verwenden, können Sie auch die Klasse FlexPrintJob verwenden, um einige Layout- und Seitennummerierungen für Sie zu übernehmen.

+0

Persönlich bin ich nicht sehr scharf auf diese Lösung. Siehe meine Alternative unten. – jpwrunyan

1

Ich habe versucht, die Bühne zu drucken und stolperte mit vielen Problemen, die Bühne zu bekommen, um die Größe richtig zu ändern, also verwende ich eine Kombination von Lösungen, die die Umwandlung der Bühne in eine Bitmap umfasste.

Hier ist meine Quelle:

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; 
    } 
    } 

Hoffe, dass es jemand hilft ....

+0

Nichts für ungut, aber das ist im Wesentlichen das gleiche wie die Antwort, die ich zur Verfügung gestellt habe, außer dass Ihr Code mehr Zeilen enthält. Der Unterschied ist, dass meins das Flex-Framework verwendet. Ihr Projekt wäre also in einem AS-only-Projekt nützlich. Außerdem müssen Sie den Inhalt nicht außerhalb des Bildschirms ausblenden, wenn Sie ihn im selben Funktionsblock entfernen. Niemand wird es ohne eine Bildschirmaktualisierung sehen. – jpwrunyan

0

Ich hatte das gleiche Problem heute. Ich bin schockiert (schockiert!), Dass Adobe es nicht so einfach macht, die Bühne zu drucken. Ich habe mich dafür entschieden, ein Bitmap-Bild einfach aus der Bühneninstanz zu erstellen, es zur Anwendungsinstanz hinzuzufügen und dann zu drucken. Ich denke, das ist einfacher, als zu versuchen, Dinge in eine andere Komponente zu verpacken, mit dem Layout zu verwirren, usw. Da Sie nur ein Bild für den gesamten Bildschirm haben, müssen Sie sich nur mit der Positionierung dieses einen Bildes beschäftigen. Wenn Sie das absolute Layout verwenden, sollte keine Positionierung erforderlich sein. Es wird nur perfekt Ihre tatsächlichen Inhalte überlappen. Drucken Sie die Anwendungsinstanz. Entfernen Sie die Container-Instanz der Bitmap und Sie sind fertig.

Nun könnte es möglich sein, PrintJob anstelle von FlexPrintJob zu verwenden, um die Bühne mit weniger Codezeilen zu drucken, aber ich glaube nicht, dass die Bühneninstanz ein Sprite ist, also egal, so etwas wie das Folgende ist notwendig.

Diese Methode setzt voraus, dass "dies" die Anwendung ist.

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(); 
} 

Es gibt nur eine Einschränkung, die ich an diesen Ansatz denken kann. Das ist die maximale Bitmap-Bildgrößenbeschränkung von Flash. Aber für bis zu einem HD-Monitor denke ich, dass es kein Problem gibt.

Verwandte Themen