Как распечатать все элементы на сцене с помощью ActionScript 3.0? - PullRequest
1 голос
/ 27 марта 2009

У меня есть проект flex / as3, в котором у меня есть растровый фон, а затем я рисую спрайты поверх этого фона. Он создает карту и маршрут к местам на карте. Я реализую функцию печати, чтобы распечатать эту карту (флэш-экран), а затем добавить другую информацию на той же странице. Карта отображается с шириной 800 пикселей и высотой около 480 пикселей на экране компьютера.

Я посмотрел в классе PrintJob в AS3 и нашел способ напечатать отдельное растровое изображение или спрайт, но мне бы очень хотелось создать снимок экрана с флэш-файлом, а затем сохранить его в виде png. отображать отдельно на новой странице с дополнительной информацией. Я знаю, что сохранение снимка экрана в формате .png - это другая проблема, но если бы я смог выяснить, как захватить сцену в первую очередь, вторая проблема перестала бы быть.

Ответы [ 3 ]

1 голос
/ 22 сентября 2010

Я пытался напечатать сцену и столкнулся с множеством проблем при настройке размера сцены должным образом, поэтому я использую комбинацию решений, которая включала преобразование сцены в растровое изображение.

Вот мой источник:

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

Надеюсь, это кому-нибудь поможет ...

1 голос
/ 30 марта 2009

Вам нужно будет обернуть все, что было на сцене в экземпляре Sprite, а затем передать этот Sprite в метод PrintJob.addPage ().

Если вы используете Flex, вы также можете использовать класс FlexPrintJob для обработки некоторых макетов и нумерации страниц.

0 голосов
/ 17 января 2012

У меня была такая же проблема сегодня. Я шокирован (шокирован!) Тем, что 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();
}

У этого подхода есть только одно ограничение. Это ограничение максимального размера растрового изображения в Flash. Но для монитора HD, я думаю, нет проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...