Browse > Home > Archive: 三月 2008

| Subcribe via RSS

PHPQuery: A Simple AS3 Warper of AMFPHP

三月 25th, 2008 | No Comments , 250 views | Posted by flashlizi in Flex3

一个简单的amfphp封装,简化了amfphp的使用。
最新更新:增加getServices方法,返回所有可用的services方法集合的数组。需要在amfphp/services目录下增加ServiceUtils.php文件。PHPQuery和ServiceUtils在附件中均有下载。
使用示例:
var gateway:String = "http://localhost/amfphp/gateway.php";
PHPQuery.connect(gateway);
PHPQuery.getServices(onServices);
function onServices(result:Array):void {
for each(var method:* in result) trace(method);
}
var params:String = "www.riaidea.com";
PHPQuery.call("HelloWorld.say", onResult, onFault, params);
function onResult(result:Object):void {
trace(String(result));
}
function onFault(fault:Object):void {
trace(String(fault.description));
}

PHPQuery源码:
package {
import flash.net.NetConnection;
import flash.net.Responder;
public class PHPQuery {
private static var _gateway:String;
private static var netConnection:NetConnection;
//connect to specified amfphp gateway
public static function connect(gateway:String):void {
if (!netConnection) netConnection = new NetConnection();
_gateway = gateway;
netConnection.connect(gateway);
}
//call a php method.
public static function call(command:String, onResult:Function, onFault:Function = null, ...args):void {
var responder:Responder = new Responder(onResult, onFault);
var params:Array = [command, responder].concat(args);
netConnection.call.apply(null, params);
}
//get all services and theirs methods on amfphp
public static function getServices(onResult:Function, onFault:Function = null):void {
PHPQuery.call("ServiceUtils.getServices", function(result:Object) { onResult.call(null, listServices(result)); } , null);
}
//list all services's methods
private static function listServices(result:Object):Array {
var out:Array = [];
for (var i:int = 0; i < result.length; i++) {
var re:Object = result[i];
if (re.children) {
var child:Array = listServices(re.children);
out = out.concat(child);
}else {
for(var m:String in re.methods) {
var method:String = "";
if (re.data) {
method += re.data.replace( /\\/ , ".");
}
method += re.label + "." + m;
out.push(method);
}
}
}
return out;
}
//get the amfphp gateway
public static function get gateway():String {
return _gateway;
}
}
}

点击下载PHPQuery和ServiceUtils文件

为你的ActionScript项目创建API文档

三月 19th, 2008 | No Comments , 258 views | Posted by flashlizi in Flex3

作为一个developer,写项目的API文档是非常重要的一件事情,flash developer也不例外。ASDoc能让我们快速创建ActionScript项目的API文档。

下面以一个实际的示例来说明如何创建API文档:

1)打开Adobe Flex 3 SDK Command Prompt。
2)用cd命令进入ActionScript项目的目录,如:cd D:\flashlizi\asdoc。
3)输入ASDoc命令:
asdoc -source-path . -window-title "ASDoc演示示例类" -package riaidea.asdoc "A Example of Using ASDoc" -doc-classes riaidea.utils.zip.ASDocExample
这是一个基本的asdoc命令。其中参数source-path表示as源文件目录,如果在当面目录则用点“.”来表示。window-title表示帮助文档的窗口标题,即浏览器窗口标题。package参数用来描述一个包,如这里描述包riaidea.asdoc为"A Example of Using ASDoc”。doc-classes用来指明需要生成API文档的类,如果指定的类中还引用了其他自定义类,那这些类也会生成API文档。
更详细的asdoc命令使用可以查看这里:http://livedocs.adobe.com/flex/3/html/index.html?content=asdoc_9.html
4)执行完毕后,在asdoc目录下会生成了一个asdoc-output目录,里面就是API文档。一般的,我们生成的API文档无需按26个字母分类,因此我们可以把里面的all-index-A.html到all-index-Z.html删除,并删除title-bar.html中的Index链接,这样的API文档就精简多了。

下面是本例中的类riaidea.utils.zip.ASDocExample的源码:
package riaidea.asdoc{
import flash.display.Sprite;
import flash.events.Event;
/**
* 当创建一个ASDocExample实例的时候调度init事件。
* @eventType mx.events.FlexEvent.BUTTON_DOWN
*/
[Event(name="init", type="flash.events.Event")]
/**
* ASDoc演示类。此例演示了如何写注释才能创建一个基本的AS项目的API文档。
* @example
* <listing version="3.0">
* var eg:ASDocExample=new ASDocExample();
* eg.print("ASDoc演示类");
* eg.test("flashlizi");
* * @see http://www.riaidea.com
*/
public class ASDocExample extends Sprite {
/**
* 实例的创建者。
* @default flashlizi
*/
public var creator:String;
private var _date:Date;
/**
* 构造函数-constructor。
*/
public function ASDocExample() {
this.creator = "flashlizi";
this._date = new Date();
dispatchEvent(new Event(Event.INIT));
}
/**
* 打印参数指定内容。
* @param content 要打印的内容。
*/
public function print(content:String):void {
trace(content);
}
/**
* 测试类的创建者是否与参数指定名称相同。
* @param name 测试指定的名称。
* @return 创建者与指定名称相同返回true,否则返回false。
*/
public function test(name:String):Boolean {
return name == creator;
}
/**
* 实例的创建时间。
*/
public function get date():Date {
return date || new Date();
}
public function set date(value:Date):void {
_date = value;
}
}
}

现在来说明一下如果写类的注释才能创建一个比较完善的API文档。

1)首先,只有包含在/**与*/之间的注释才能被asdoc识别。对一个类的方法或者属性做注释,只要在之前加上这样的注释就可以了。
2)注释的第一行开始(不包括注释标记)是被注释对象(方法、属性等)的说明介绍。当出现@param 这样的注释标记的时候,asdoc就会自动解析为相应的内容。
3)本例ASDocExample中包含了一些常用的asdoc标记:
a、eventType。只能用于注释Event元标记,如[Event(name="init", type="flash.events.Event")]。这样在API文档中这个事件会出现这个类的Event说明块中。
b、example。用于创建一个示例。示例代码需写在< listing >和< /listing >之间。
c、see。用于创建“另请参见”说明块。
d、default。用于创建属性的“默认值”说明。
e、param。用于创建对方法的参数的说明。
f、return。用于创建对方法的返回值的说明。
g、private。使用此标记的方法或属性将不会输出到API文档中。

更多的asdoc标记请参看:http://livedocs.adobe.com/flex/3/html/help.html?content=asdoc_6.html#186140

下载本例的所有源文件: ASDocExample

update(2009-2-2): Adobe官方ASDoc Tool使用文档

Batch convert files to Flashpaper2

三月 18th, 2008 | No Comments , 282 views | Posted by flashlizi in Flash CS3/AS3

Command:
FlashPrinter.exe {PATH TO DOCUMENT} -o {OUTPUT PATH & FILE with SWF extention}
Example:
FlashPrinter.exe riaidea.doc -o riaidea.swf

XFL:新的flash源文件格式

三月 7th, 2008 | No Comments , 331 views | Posted by flashlizi in News

今天从Moock的blog上看到一个令人兴奋的消息:XFL: Flash's New Source Format。根据adobe的flash产品经理Richard Galvan的透露,flash IDE的下一个版本(flash cs4)将会引入一种全新的文件格式:XFL。

现在为止,flash源文件都是保存为二进制的FLA格式,.fla文件格式不是公开的。将来的flash cs4除开fla之外还可以把flash源文件保存为.xfl格式,这是一种和air类似的zip压缩文件格式。zip文件里包含一个描述flash文件结构的xml文件和一个包含所有组件资源(如图片、声音、视频等)的文件夹。adobe将会公开XFL文件格式,允许第三方工具导入和导出XFL。不过,最终还是要通过flash工具把XFL文件编译为swf文件。

当然,如果adobe再提供XFL-TO-SWF的编译器或接口,那么现在的一些如flash develop这样的开发工具将会变成无需借助flash IDE,可以完全独立开发flash项目的IDE。以后开发flash将会越来越爽快了!

继续联想一下,看着silverlight的迅速发展,adobe是否有可能考虑增加一种swfx的格式,一个zip文件,包含swf文件的xml描述以及资源,就像microsoft的open XML一样,而flash player所要做的就是解析以及呈现zip文件里的内容。

AS3 Library: ZipArchive 0.1 Release

三月 5th, 2008 | 7 Comments , 989 views | Posted by flashlizi in Flash CS3/AS3

ZipArchive是一个Zip档案处理类,可读写各种zip格式文件。(update version 0.11)

基本介绍:
1)轻松创建或加载一个zip档案;
2)多种方式读取和删除zip档案中的文件;
3)支持中文文件名;
4)非常容易序列化一个zip档案,如有AIR、PHP等的支持就可以把生成的zip档案保存在本地或服务器上。

更新:此项目已更新至0.2版本,请大家到http://code.google.com/p/as3-ziparchive/去下载最新的源码和示例。
下载:源文件+API文档+示例
查看:API文档

读取zip文件可查看下载包中的example示例。保存zip文件部分可参考我以前发布的AirZip功能演示。

下面是下载包中的example示例的部分代码:

public class Example extends Sprite {
private var zip1:ZipArchive = new ZipArchive();
public function Example() {
//加载一个zip档案
zip1.load(“test.zip”);
zip1.addEventListener(ProgressEvent.PROGRESS, loading);
zip1.addEventListener(ZipEvent.ZIP_INIT, inited);
zip1.addEventListener(ZipEvent.ZIP_FAILED, failed);
zip1.addEventListener(IOErrorEvent.IO_ERROR, ioError);
}
private function inited(evt:ZipEvent):void {
zip1.removeEventListener(ProgressEvent.PROGRESS, loading);
zip1.removeEventListener(ZipEvent.ZIP_INIT, inited);
zip1.removeEventListener(ZipEvent.ZIP_FAILED, failed);
//添加ZIP_CONTENT_LOADED事件侦听器
zip1.addEventListener(ZipEvent.ZIP_CONTENT_LOADED, imgloaded);
trace(“原始zip文件内容\r”, zip1);
//读取zip1中的xml文件
var xmlFile:ZipFile = zip1.getFileByName(“sample.xml”);
var xml:XML = new XML(xmlFile.data);
trace(xml);
//根据字符串内容创建一个新的txt文件
var txtContent:String = “这是一个测试文本文件”;
zip1.addFileFromString(“测试.txt”, txtContent);
//trace(zip1.getFileByName(“测试.txt”).data);
//复制zip1中的girl.jpg为张曼玉.jpg
var zmy:ZipFile = zip1.getFileByName(“girl.jpg”);
zip1.addFileFromBytes(“张曼玉.jpg”, zmy.data);
//加载zip1中的新生成的图片文件的Bitmap对象
zip1.getBitmapByName(“张曼玉.jpg”);
//删除图片文件logo.gif
zip1.removeFileByName(“logo.gif”);
trace(“\r修改后的zip文件内容\r”, zip1);
}
private function imgloaded(evt:ZipEvent):void {
zip1.removeEventListener(ZipEvent.ZIP_CONTENT_LOADED, imgloaded);
var img:Bitmap = evt.content as Bitmap;
addChild(img);
}
private function loading(evt:ProgressEvent):void {
//trace(evt.currentTarget, evt.bytesLoaded, evt.bytesTotal);
}
private function failed(evt:ZipEvent):void {
//trace(evt.content);
}
private function ioError(evt:IOErrorEvent):void {
//trace(evt);
}
}

AirZip:解压缩Zip文件的air小程序

三月 4th, 2008 | 1 Comment , 801 views | Posted by flashlizi in Adobe AIR

最近一个项目中需要用到解压缩Zip文件,网上比较好的有fzip和nochump的zipFile组件。不过两者都不太符合我的要求,因此我采用nochump的zip文件解压Inflater算法,开发了自己的ZipArchive组件。

部分API如下:
1、constructor [ZipArchive构造函数,创建一个新的zip档案]
2、load [加载一个外部zip档案,如.zip/.air/.docx/.xlsx等采用zlib压缩的档案]
3、open [打开一个二进制流的zip档案]
4、output [把ZipArchive档案实例输出二进制的zip文件,用来生成zip文件]
5、getFileByName [根据文件名获取zip档案中的某个文件]
6、getFileAt [根据文件位置序号获取zip档案中的某个文件]
7、getBitmapByName [根据文件名获取zip档案中的某个图片文件的Bitmap]
8、removeFileByName [根据文件名删除zip档案中的某个文件]
9、removeFileAt [根据文件位置序号删除zip档案中的某个文件]
10、addFile [添加文件到zip档案]
11、addFileFromBytes [从二进制数据添加文件到zip档案]
12、addFileFromString [根据指定的字符串内容添加文件到zip档案,比如.txt/.xml文件]

因为AIR1.0正式版刚刚发布,所以我根据此组件,做了一个简单的zip文件浏览和压缩的程序。使用此程序可以打开一个zip格式的文件,如.zip/.air/.docx/.xlsx等,显示此zip档案中的所有文件信息。当然还可以使用此程序把若干个文件压缩成一个zip档案保存到本地。

附上程序截图:

浏览压缩文件


压缩为zip文件

有兴趣的朋友可以下载此Air程序来体验一下(此zip文件就是airzip生成的)。ZipArchive组件还在完善中,源文件和API文档不久也会释出。