我有一个flex / as3项目,其中我有一个位图背景,然后在该背景之上绘制Sprite。它创建地图和到地图上位置的路线。我正在实现一个打印功能来打印该地图(闪光屏幕),然后将其他信息添加到同一页面。地图在计算机屏幕上显示宽度为800px,高度为480px。
我已经查看了AS3中的PrintJob类,并找到了一种打印单独的位图或精灵的方法,但我真的只想创建一个flash文件的屏幕截图,然后将其保存为png。在具有附加信息的新页面上单独显示。我知道将屏幕截图保存为.png是一个不同的问题,但如果我能够弄清楚如何捕获阶段,第二个问题将不复存在。
答案 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的最大位图图像大小约束。但对于高清显示器,我认为没有问题。