flexpaper的二次开发总结及探讨

写在开头:

         本文主要资料参考来自mark的《Flexpaper二次开发入门教程》,在此鸣谢!该教程写得还是很详细,初次接触flexpaper的可以先看看该教程。

         下面主要谈谈二次开发flexpaper的过程中的一些总结。

        我的项目名称为Diyflexpaper,修改Diyflexpaper.mxml如下:



	
	
		[ResourceBundle("FlexPaper")]
		[Event(name="onDocumentLoaded", type="com.devaldi.events.DocumentLoadedEvent")]
		[Event(name="onLoadingProgress", type="flash.events.ProgressEvent")]
		[Event(name="onDocumentLoadedError", type="flash.events.ErrorEvent")]
		[Event(name="onCurrPageChanged", type="com.devaldi.events.CurrentPageChangedEvent")]
		[Event(name="onDocumentLoading", type="flash.events.Event")]
		[Event(name="onExternalLinkClicked", type="com.devaldi.events.ExternalLinkClickedEvent")]
		[Event(name="onDocumentPrinted", type="com.devaldi.events.DocumentPrintedEvent")]
		[Event(name="onPageLoaded", type="com.devaldi.events.PageLoadedEvent")]
		[Event(name="onPageLoading", type="com.devaldi.events.PageLoadingEvent")]
		[Event(name="onErrorLoadingPage", type="com.devaldi.events.ErrorLoadingPageEvent")]
	
	
		
	
	

注:如果上面代码出现

标签请删除,这是博客自动加上去的。

如果编译出现错误:


设置该项目属性,将附加的编译参数修改成如下所示:

-locale=en_US,fr_FR,zh_CN,es_ES,ru_RU,pt_BR,hu_HU,tr_TR,se_SE,pt_PT,el_EL,dn_DN,cz_CS,it_IT,de_DE,pl_PL,fi_FN,pv_FN,nl_NL,bg_BG -source-path=locale/{locale} 

如果语言切换只涉及中英文的话,只需要:-locale=en_US,zh_CN -source-path=locale/{locale} 即可。

主要总结:

        1、mark文中没有添加多余可用的api接口,从Diyflexpaper.mxml代码中可以看到,已经添加的函数有:

//开放给外部(javascript)调用
                ExternalInterface.addCallback("hasFocus", hasFocus);
                ExternalInterface.addCallback("setViewerFocus", setViewerFocus); 
                ExternalInterface.addCallback("gotoPage", gotoPage);
                ExternalInterface.addCallback("fitWidth", fitWidth);
                ExternalInterface.addCallback("fitHeight", fitHeight);
                ExternalInterface.addCallback("loadSwf", loadSwf);
                ExternalInterface.addCallback("printPaperRange", printPaperRange);
                ExternalInterface.addCallback("searchText", searchText);
                ExternalInterface.addCallback("prevSearchMatch", prevSearchMatch);
                ExternalInterface.addCallback("nextSearchMatch", nextSearchMatch);
                ExternalInterface.addCallback("switchMode", switchMode);
                ExternalInterface.addCallback("Zoom", Zoom);
                ExternalInterface.addCallback("nextPage", nextPage);
                ExternalInterface.addCallback("getCurrPage", getCurrPage);
                ExternalInterface.addCallback("prevPage", prevPage);
                ExternalInterface.addCallback("printPaper", printPaper);
                ExternalInterface.addCallback("getTotalPages", getTotalPages);

         2、解决中文名swf无法加载问题

         首先我是按mark的方法修改,但还是不能加载,他的方法是:

          SwfFile : escape('中文ajava.swf')改为SwfFile : decodeURI('中文ajava.swf')

          Viewer.as - set SwfFile(s:String) 方法中,修改如下代码:

-------------------------------------------------------------------
if(EncodeURI)
	s = unescape(s);
改为
if(EncodeURI)
	s = decodeURI(s);
--------------------------------------------------------------------
if(!pagesSplit){
	
	_swfFile = s;
	if(EncodeURI)
		_swfFile = encodeURI(s);
	else
		_swfFile = s;
}
else
	_swfFile = s;
改为
_swfFile = s;

        以他的意思是去除整个if语句,应该是这个意思,修改后还是加载不了,后来发现问题应该只出在前面s=unescape(s)这里,改为s=decodeURI(s),只改这里,后面的if语句保留,而SwfFile : escape('中文ajava.swf')改为SwfFile : encodeURI('中文ajava.swf') ,这里我采用encodeURI,因为encodeURI和decodeURI是配对的,不可能两次使用 decodeURI吧?而且测试发现,使用loadSwf()方法,如果用loadSwf(decodeURI(url))是加载不了的(当然这里说的都是加载中文名的swf),特两处统一用encodeURI()编码。

    3、js中如何调用flex中的方法,比如调用loadSwf()函数。

     其实flash版的flexpaper的flexpaper_flash.js文件中开头已经定义一个获取flex对象的方法:

window.$FlexPaper = window["$FlexPaper"] = function(){
	if (window['flexpaper']) 
		return window['flexpaper'];
	else 
		window['flexpaper'] = window.FlexPaperViewer_Instance.getApi();
	
	return window['flexpaper'];
};
      那么我们就可以这样用了:

        var swf="代码规范.swf";
    	var pdf=$FlexPaper();
    	pdf.loadSwf(encodeURI(swf));
      4、如何分页加载swf文件。

       这里引用一下别人的方法:

        C:\SWFTools\pdf2swf.exe Paper.pdf -o Paper%.swf-f -T 9 -t -s storeallcharacters
        大家可以看到上面的命令行比原来只多了一个%符号,这个符号表示在PDF2SWF转换文档时,将为每一个页创建一个swf文件。如:"Paper1.swf", "Paper2.swf"。然后在FlexPaper控件配置加载SwfFile的地方,采用:{filename[*,padding],total pages}这种语法表明。比如:SwfFile :"{"+encodeURI(url+"热效应保护标准原文")+"[*,1].swf,13}"。

        padding是递增数,设置为1;total pages是总页数。

        注:当加载分页的swf文件后,调用loadSwf()函数切换swf会出错,我测试是这样的,还未研究解决办法。

       

 很明显这个地址完全是错误的,为什么?


主要探讨问题:

        1、Diyflexpaper.mxml中的事件仿照FlexPaperViewer.mxml的方法,但在js中如何触发并处理事件还不会(呵呵)。

        2、分页加载的swf切换错误问题待解决。

        3、初始化未设置参数InitViewMode,这是因为加入该参数提示错误:

    

        到此,先记下这些,后面继续研究。

 
2012-12-15更新,已经编译好的swf文件:
http://download.csdn.net/detail/kunoy/4885745 
若有问题,请留言反馈一下,谢谢!另外此二次开发版本为1.5.6,与现在最新2.0.3可能不兼容,因为已经有仁兄反应2.0.3用不了。后面有时间的话再升级一下。
 
作者: kunoy
出处: http://blog.csdn.net/kunoy
申明:作者写博是为了总结经验,和交流学习之用。
如需转载,请尽量保留此申明,并在文章页面明显位置给出原文连接。谢谢!

 

你可能感兴趣的:(Adobe,Flex,Web应用)