2009-03-27 5 views
1

私はビットマップの背景を持つflex/as3プロジェクトを持っていて、その背景の上にスプライトを描画します。それはマップと、地図上の場所へのルートを作成します。私はそのマップ(フラッシュ画面)を印刷し、同じページに他の情報を追加するための印刷機能を実装しています。マップは、コンピュータ画面上に幅800px、高さ480pxで表示されます。ActionScript 3.0でステージ上のすべての要素をどのように印刷しますか?

私はAS3のPrintJobクラスを調べて、別のビットマップまたはスプライトを印刷する方法を見つけましたが、実際にはフラッシュファイルのスクリーンキャプチャを作成し、それをpngとして保存したいと思います。追加情報を含む新しいページに個別に表示することができます。スクリーンキャプチャを.pngとして保存するのは別の問題ですが、最初にステージをキャプチャする方法を理解できれば、2番目の問題は終了します。

答えて

1

ステージ上のすべてをSpriteインスタンスでラップし、そのSpriteをPrintJob.addPage()メソッドに渡す必要があります。

フレックスを使用している場合は、FlexPrintJobクラスを使用して、レイアウトとページ番号の一部を処理することもできます。

+0

個人的には、私はこの解決策に熱心ではありません。以下の私の選択肢を見てください。 – jpwrunyan

1

私はステージを印刷しようとしていましたが、ステージのサイズを適切に変更するには多くの問題がありましたので、ステージをビットマップに変換するというソリューションの組み合わせを使用しました。

ここに私のソース:

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

は、それが誰かを助け....

+0

違反はありませんが、それはあなたのコードの行数が増えたことを除いて、私が提示した回答と本質的に同じです。違いは、私がFlexフレームワークを使用していることです。だからあなたはASのみのプロジェクトで役に立ちます。また、同じファンクションブロックでコンテンツを削除すると、コンテンツを画面外に「隠す」必要はありません。画面を更新しても誰もそれを見ることはできません。 – jpwrunyan

0

今日は同じ問題を持っていたと思います。私はショックを受けました(ショックを受けました)、アドビはあなたにステージを印刷するという簡単なことをさせません。ステージインスタンスからビットマップイメージを簡単に作成し、それをアプリケーションインスタンスに追加してから印刷しました。私は、これは、他のコンポーネントやレイアウトなどでラップしようとするよりも簡単だと思います。画面全体に対して1つのイメージしかないので、この1つのイメージを配置するだけで構いません。アブソリュートレイアウトを使用している場合は、配置する必要はありません。実際の内容と完全に重複しています。アプリケーションインスタンスを印刷します。ビットマップのコンテナインスタンスを削除すると、完了です。

ここで、コードの行数を減らして印刷するのに、FlexPrintJobの代わりにPrintJobを使用することは可能かもしれませんが、ステージインスタンスがスプライトであるとは思わないので、次のようなものが必要です。

このメソッドは、 "this"がアプリケーションであることを前提としています。

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

このアプローチには1つの制限があります。これは、フラッシュの最大ビットマップイメージサイズの制約です。しかし、HDモニターまで、私は問題はないと思う。