【问题标题】:How do you print all Elements on the Stage with ActionScript 3.0?如何使用 ActionScript 3.0 打印舞台上的所有元素?
【发布时间】:2009-03-27 17:11:04
【问题描述】:

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

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

【问题讨论】:

    标签: apache-flex actionscript-3


    【解决方案1】:

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

    如果您使用的是 Flex,那么您还可以使用 FlexPrintJob 类为您处理一些布局和分页。

    【讨论】:

    • 就个人而言,我对这个解决方案不是很热衷。请参阅下面的替代方案。
    【解决方案2】:

    我正在尝试打印舞台,但在正确调整舞台大小时遇到​​了很多问题,因此我使用了多种解决方案,包括将舞台转换为位图。

    这是我的来源:

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

    希望对某人有所帮助....

    【讨论】:

    • 无意冒犯,但这与我提供的答案基本相同,只是您的代码行数更多。不同之处在于我使用的是 Flex 框架。所以你的在纯 AS 项目中会很有用。此外,如果您在同一个功能块中将其删除,则无需在屏幕外“隐藏”内容。没有人会在不刷新屏幕的情况下看到它。
    【解决方案3】:

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

    现在,可以使用 PrintJob 而不是 FlexPrintJob 来打印更少的代码行的舞台,但我不相信舞台实例是 Sprite,所以无论如何,以下类似的东西是必要的。

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

    我只能想到这种方法的一个限制。那是闪存的最大位图图像大小限制。但是对于高达高清的显示器,我认为是没有问题的。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 1970-01-01
      • 2014-05-12
      • 2021-02-17
      • 1970-01-01
      • 2011-05-05
      • 2011-06-07
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多