1.flexpaper代码结构
图1:
图2:
2.FlexPaper,UI层次结构
主要分析viewer这个类
viewer的child有3层
最上层有个_skinImgDo:Image这个是flexPaper的logo,在右下角,放上去点击就弹出一个关于的alert
中间是_swfContainer:Canvas不过visible=false,中间这一层是不可见的
嵌套一个ui
ui里面有一个_docLoader:AVM2Loader.DocumentContainer
最下层是一个_paperContainer:ZoomCanvas
嵌套一个_displayContainer:FlowBox FlowBox是一个VBox,加了鼠标拖拽的事件
_displayContainer里面就是一个个DupImage,_pageList这个数组就是存放的DupImage,pdf有多少页就有多少个
DupImage的child是DupLoader(当前视图页,和下面看不见的那一页都是DupLoader),或者是Bitmap或者没有child(看不见的其他页都是 Bitmap或者空)
3.FlexPaper,Viewer初始化过程
Viewer的createChildren方法里面初始化各种child,添加了一个timer执行repositionPapers。随后执行FlexPaperViewer_Base的createChildren在这个方法里面对Viewer的DocLoader赋值
_docLoader:AVM2Loader,然后执行Viewer的set SWfFile,这个方法首先销毁Viewer的所有child然后给_docLoader添加一个加载完成的事件
_docLoader.addEventListener(SwfLoadedEvent.SWFLOADED, swfComplete,false,0,true);
随后执行createDisplayContainer重新创建child。然后执行_docLoader的load方法
_docLoader.load(new URLRequest(_swfFile),StreamUtil.getExecutionContext());
当load加载完成时,执行swfComplete
var mobj:Object = event.swfObject.content;
_libMC = new SwfDocument(mobj as MovieClip);
首先给_libMC赋值,然后执行createLoaderList,创建_docLoader.LoaderList:DupLoader,也就是最后我们看到的画面了
随后执行方法addInLoadedPages来添加页
for(var i:int=0;i<numPages;i++){
_libMC.gotoAndStop(i+1);
createPaper(i+1,(_libMC.width>0)?_libMC.width:w,(_libMC.height>0)?_libMC.height:h);
}
addPages();
createPaper创建DupImage对象,并依次给_pageList赋值,个数就是页数
addPages将所有的DupImage添加进_displayContainer:FlowBox
随后执行repositionPapers
LoaderList.loadBytes,加载整个pdf的Loader,最后将DupLoader添加进DupImage就显示出来了。。repositionPapers这个方法只显示动态对DupImage里面的child进行添加和移除,只让当前显示的DupImage里面的child是DupLoader并且让DupLoader跳转带指定的frame。