`

解决MovieClip打印问题 转

阅读更多

困扰我多天的MovieClip打印问题终于解决了,这就实现了PDF转成SWF后,用户在获取授权后,仍然支持其打印文档(即打印SWF)啦!是令人高兴的事情,“世上无难事,只怕有心人”,只要专注任何问题都可以一步步得到解决的。

      我的打印功能实现截图:

      

      我已经解决的打印问题:实现文档全部打印;支持单独某页(即MovieClip的某帧)的打印;默认全屏打印,在缩放模式下,支持自动调整还原后再打印,从而保证文档充满页面。

     没有实现的打印功能:1.用户自定义多页打印(不是单页打,也不是全打),这个很简单,只是没这需求,我就没添加该功能。2.打印时的预览 3.打印自定义设置(我实现的是页面自适应,不论是A4或B5,都是自动充满页面的),有兴趣的朋友可以在我的基础上对这几方面做进一步的研究。

      很遗憾,对MovieClip的帧生成缩略图工作,没有取得进展,网上没找到相关资料,但我把该任务的一些小问题解决了,有时间的话,我会继续研究的。毕竟领导对该工作也是很期待的很支持的,这功能确实能提高用户体验。

      我的该任务存在的小问题包括:文档的移动(上下左右按钮控制的移动)、鼠标拖动文档(平移文档)、文档位置自动还原功能(自动充满显示页面)、文档放大缩小时中心位置控制等等。这里的文档指的是PDF转换生成的SWF,即加载进来要控制的MovieClip。

      下面介绍一下我在实现MovieClip打印功能时对我帮助很大的网络资源。

       首先是,Chris给出的方案:AS3 Using PrintJob to print  a MovieClip  (网址:http://stackoverflow.com/questions/1422259/as3-using-printjob-to-print-a-movieclip)他对我帮助是很大的,我非常感激。虽然他的代码功能并没完全解决我的打印问题,但是它给了我思路,给我指明了一条可能可行的路,他首先迈出了伟大的第一步,我的改进完全是在他的代码的基础上,结合我的实际问题修改的。建议遇到相同问题的网友,首先要阅读理解好他的源代码。现转载他的代码如下:


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->function printMovieClip(clip:MovieClip)
{
    var printJob:PrintJob
=new PrintJob();
    var numPages:
int=0;
    var printArea:Rectangle;
    var printHeight:Number;
    var printY:
int=0;
    
if (printJob.start())
    { 
/* Resize movie clip to fit within page width */
        
if (clip.width > printJob.pageWidth)
        {
          clip.width
=printJob.pageWidth;
          clip.scaleY
=clip.scaleX;
        }
        
/* Store reference to print area in a new variable! Will save on scaling calculations later */
        printArea
=new Rectangle(00, printJob.pageWidth / clip.scaleX, printJob.pageHeight / clip.scaleY);
        numPages
=Math.ceil(clip.height / printJob.pageHeight);
         
/* Add pages to print job */
        
for (var i:int=0; i < numPages; i++)
        {
          printJob.addPage(clip, printArea);
          printArea.y
+=printArea.height;
        } 
        
/* Send print job to printer */
        printJob.send();
         
/* Delete job from memory */
        printJob
=null;
    }
}
printMovieClip(testMC);

  他主要用的是flash.printing.PrintJob,PrintJob 类用于创建内容并将其打印为一页或多页。此类允许您呈现对用户为可见、动态或在屏幕以外的内容,通过一个“打印”对话框提示用户,以及按照与内容的比例相称的比例打印未缩放的文档。此功能特别适用于呈现和打印动态内容,例如数据库内容和动态文本。

  我个人认为 PrintJob是比较灵活(我指的是打印内容的灵活和打印设置的灵活方面)的打印类的,这原本就是flash里的类。Flex AS3中仍然可以使用,Flex中有对该类的重写即FlexPrintJob,FlexPrintJob 类是 flash.printing.PrintJob 类的包装对象。它支持自动对多个页面上的输出进行切片和分页,并且将网格内容进行缩放以适合打印机的页面大小。 我原本想用该类对象实现我的打印的,但是FlexPrintJob不够灵活,只支持UIComponent对象的打印。其中的关键方法addObject(obj:IUIComponent, scaleType:String = "matchWidth"):void 将 UIComponent 对象添加到正在打印的对象列表。

      下面是使用该FlexPrintJob的例子,Flex中实现一般的UI控件的打印,还是很方便的。转载自Adobe的http://www.adobe.us/livedocs/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=printing_085_07.html


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><?xml version="1.0"?>
<!-- printing\DGPrint.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

    
<mx:Script>
        
<![CDATA[
            import mx.printing.*;

            // Create a PrintJob instance.
            private function doPrint():void {
                // Create an instance of the FlexPrintJob class.
                var printJob:FlexPrintJob = new FlexPrintJob();

                // Start the print job.
                if (printJob.start() != true) return;

                // Add the object to print. Do not scale it.
                printJob.addObject(myDataGrid, FlexPrintJobScaleType.NONE);

                // Send the job to the printer.
                printJob.send();
            }
        
]]>
    
</mx:Script>

    
<mx:VBox id="myVBox">
        
<mx:DataGrid id="myDataGrid" width="300">
            
<mx:dataProvider>
                
<mx:Object Product="Flash" Code="1000"/>
                
<mx:Object Product="Flex" Code="2000"/>
                
<mx:Object Product="ColdFusion" Code="3000"/>
                
<mx:Object Product="JRun" Code="4000"/>
            
</mx:dataProvider>
        
</mx:DataGrid>
        
<mx:Button id="myButton" 
            label
="Print" 
            click
="doPrint();"/>
    
</mx:VBox>
</mx:Application>

       上面两个资源是我主要参考的资源,网友可以搜索更多打印例子,应该好好利用互联网资源。

       最后介绍和分析我的代码。我的代码最重要的改进就是解决多页连打问题(即MovieClip的所有帧一次全打出来)。


<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1//打印函数
 2private function printMovieClip(clip:MovieClip):void
 3{
 4    var printJob:PrintJob=new PrintJob();
 5    var printArea:Rectangle;
 6    if (!printJob.start())
 7      return;
 8    //获取打印页
 9    var printPage:int=selectPages.selectedItem.data;
10    if (printPage == 0) //打印所有页面,即MovieClip的所有帧
11      {
12        for (var i:int=1; i <= clip.totalFrames; i++)
13        {
14          clip.gotoAndStop(i);
15          /* Resize movie clip to fit within page width */
16          clip.width=printJob.pageWidth;
17          clip.scaleY=clip.scaleX;
18          /* Store reference to print area in a new variable! Will save on scaling */
19          printArea=new Rectangle(0, 0, printJob.pageWidth, printJob.pageHeight);
20          //numPages=Math.ceil(clip.height / printJob.pageHeight);
21                  /* Add pages to print job */
22          printJob.addPage(clip, printArea);
23        }
24      }
25    else ///单独打印指定页面,即MovieClip的某帧打印
26    {
27        clip.gotoAndStop(printPage);
28        /* Resize movie clip to fit within page width */
29        clip.width=printJob.pageWidth;
30        clip.scaleY=clip.scaleX;
31        printArea=new Rectangle(0, 0, printJob.pageWidth, printJob.pageHeight);
32         /* Add pages to print job */
33        printJob.addPage(clip, printArea);
34        }
35
36        /* Send print job to printer */
37        printJob.send(); 
38                 /* Delete job from memory */
39        printJob=null;
40
41    }

 

分享到:
评论
1 楼 763675117 2011-04-14  
你好,fengxiangpiao,看了你的文档,我的需求和你差不多。现在碰到一个问题,就是将打印内容转换成黑白后打印?我的Q:763675117 ;Hi百度:763675117 ,还希望能交流交流

相关推荐

    将AMV1影片转换为MovieClip

    这篇内容将详细讲解如何利用提供的`AVM1Movie_To_MovieClip`类将AMV1影片转换为Flash中的MovieClip对象,以便于进一步的编程操作。 首先,ActionScript 3(AS3)是Flash平台的主要编程语言,它提供了强大的功能来...

    MovieClip做背景放大拖动问题

    MovieClip做背景放大拖动问题

    FLASH CS3创建的MovieClip通过代码加入到场景

    这篇博文“FLASH CS3创建的MovieClip通过代码加入到场景”探讨了如何利用ActionScript 2.0(Flash CS3所使用的编程语言)将MovieClip对象动态地添加到舞台上。MovieClip是Flash中的一个核心概念,它是一种可以包含多...

    actionscript3 FLEX显示MovieClip, sprite, 文字等demo源代码.zip

    这个压缩包中的资源主要集中在如何在Flex项目中显示不同的视觉元素,如MovieClip、Sprite和文字,这些都是构建交互式用户界面的基本组件。 1. **MovieClip**: MovieClip是ActionScript3中的一个类,它继承自Sprite...

    flex调用swf——swf可以转成具体的对象,而非MovieClip

    在描述的博文中,作者可能详细阐述了如何配置和使用这种方法,以及在实际项目中遇到的问题和解决方案。遗憾的是,由于没有提供具体的内容,我们无法给出更多细节。 在项目结构方面,`.actionScriptProperties`、`....

    flash的MovieClip.as

    flash的MovieClip.as,用于影片属性控制。

    Flex 打印例子官方的哦

    3. **添加要打印的内容**:Flex中,你可以将`DisplayObject`实例(如`Sprite`或`MovieClip`)添加到打印任务中。这通常涉及将屏幕上的可视元素复制到打印作业。使用`printJob.addObject()`方法,传入要打印的`...

    pixi-movieclip-speed:根据当前浏览器的fps速率动态调整PIXI movieclip的动画速度

    pixi-movieclip-speed 根据当前浏览器的fps速率动态调整PIXI movieclip的动画速度。 当PIXI movieclip动画速度设置在0到1之间时,假定您的浏览器始终以60fps运行。 想象一下,精灵表格动画以24fps导出并且动画速度...

    转盘类源码

    转盘类源码是Flash开发中的一个重要组成部分,主要用于创建各种抽奖、游戏或互动展示效果。在AS3(ActionScript 3)中,转盘通常是一个...记住,深入理解源码不仅有助于学习技术,也能提升解决问题和创新设计的能力。

    flash旋转相册大全

    例如,`movieClip.rotation += angle` 这行代码可以让movieClip实例沿着Z轴按angle的角度进行旋转。更进一步,利用 Tween 类或内置的 easing 函数,可以创建平滑的旋转动画,使旋转过程更加自然流畅。 "Flash旋转...

    SWF转PNG序列图工具

    SWF转PNG序列图工具是一种专门用于将Adobe Flash(SWF)文件转换为PNG图像序列的软件或服务。这种工具的目的是为了方便处理SWF文件中的动画内容,尤其是在SWF不支持或者无法直接导出为其他格式时。SWF文件通常是...

    Flash光环旋转的Loading效果.rar

    2. **MovieClip**:在Flash中,MovieClip是一个可以包含多个帧和动作的动画对象。我们可以创建一个MovieClip来表示旋转的光环,并在其时间轴上设置动画帧以实现旋转效果。 3. **颜色渐变**:要实现五彩光环的效果,...

    简单的Flash转盘

    2. **时间轴控制**:通过`MovieClip`对象的`play()`和`stop()`方法来控制转盘的动画播放,实现旋转和停止。 3. **速度控制**:“获取开始速度”和“获取停止速度”意味着转盘的旋转速度是可变的。这可能涉及到设置...

    控制flash按倒序播放 as3代码

    你可以通过实例化一个MovieClip并访问其`play()`和`stop()`方法来控制播放。 3. **倒序播放的核心概念** - **gotoAndStop()**:此方法用于使电影剪辑跳转到指定帧并停止播放。 - **totalFrames**:MovieClip对象...

    AS3中MovieClip的图层切换

    在As3中将AS2中的深度改成了标签,一直没闹明白怎么使用,一般都是直接addChild把mc放到最上面 今天做的这个因为本身在mc中,所以addChild会吧mc再添加一次,造成mc重复 研究了很久,发现了这个,并非原创,欢迎大家...

    egret图集拆分工具.zip

    总的来说,Egret图集拆分工具是Python编程技术与Egret游戏开发实践相结合的产物,它为解决特定的资源管理问题提供了便利,体现了编程在游戏开发中的实用性与灵活性。对于Egret开发者来说,掌握这类工具的使用方法...

Global site tag (gtag.js) - Google Analytics