如何使用ActionScript 3.0在舞台上打印所有元素?

时间:2009-03-27 17:11:05

标签: flex actionscript-3

我有一个flex / as3项目,其中我有一个位图背景,然后在该背景之上绘制Sprite。它创建地图和到地图上位置的路线。我正在实现一个打印功能来打印该地图(闪光屏幕),然后将其他信息添加到同一页面。地图在计算机屏幕上显示宽度为800px,高度为480px。

我已经查看了AS3中的PrintJob类,并找到了一种打印单独的位图或精灵的方法,但我真的只想创建一个flash文件的屏幕截图,然后将其保存为png。在具有附加信息的新页面上单独显示。我知道将屏幕截图保存为.png是一个不同的问题,但如果我能够弄清楚如何捕获阶段,第二个问题将不复存在。

3 个答案:

答案 0 :(得分:1)

您需要在Sprite实例中包装舞台上的所有内容,然后将该Sprite传递给PrintJob.addPage()方法。

如果你正在使用Flex,那么你也可以使用FlexPrintJob类来处理一些布局和分页。

答案 1 :(得分: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;
   }
  }

希望它有所帮助......

答案 2 :(得分:0)

我今天遇到了同样的问题。我很震惊(震惊!)Adobe不会让你做一个像打印舞台这样简单的事情。我选择从舞台实例中简单地创建一个位图图像,将其添加到应用程序实例,然后打印它。我认为这比试图将东西包装在另一个组件中,混乱布局等更简单。因为整个屏幕只有一个图像,所以只需要定位这个图像。如果使用绝对布局,则甚至不需要定位。它将完全重叠您的实际内容。打印应用程序实例。删除位图的容器实例,你就完成了。

现在,有可能使用PrintJob而不是FlexPrintJob来打印具有更少行代码的舞台,但我不认为舞台实例是精灵,所以无论如何都需要以下内容。

此方法假定“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();
}

我可以想到这种方法只有一个限制。这是flash的最大位图图像大小约束。但对于高清显示器,我认为没有问题。