Browse > Home

| Subcribe via RSS

慎用正则表达式RegExp

八月 7th, 2008 | No Comments , 864 views | Posted by flashlizi in Flash CS3/AS3

AS3中的正则表达式效率并不高,在很多时候如果用其他方法能实现的话尽量不要用正则,所以String的replace、search、match如果有替换方法的话尽量不要用它们,比如用split&join方法代替一般replace。当然在一些用普通方法不好实现的复杂问题中用正则还是很好的。

比如下面的例子:
var str:String="i love flash-123";
test1(); //replace test1: 330 iloveflash
test2(); //strip test2: 67 iloveflash
function test1():void
{
var time=getTimer();
for(var i = 0; i < 1e4; i++)
{
str.replace(/\W|[0-9]|_/g, "");
}
trace("replace test1:", (getTimer()-time), str.replace(/\W|[0-9]|_/g, ""));
}
function test2():void
{
var time=getTimer();
for(var i = 0; i < 1e4; i++)
{
strip(str);
}
trace("strip test2:", (getTimer()-time), strip(str));
}
function strip(str:String):String
{
var newstr:String = "";
for (var i:int = 0, len:int = str.length; i < len; i++)
{
var char:String = str.charAt(i);
if (char >= “a”; && char <= "z") newstr += char;
}
return newstr;
}

AS3 Component: RichTextField

六月 25th, 2008 | 4 Comments , 2,040 views | Posted by flashlizi in Flash CS3/AS3

Just a very simple demo, welcome any feedback (bug or suggestion).

Demo Update:06-27
like MSN or QQ, you can input any content with smileys (click smileys to input) , then send it to the output window.

用FlashDevelop开发兼容Flash和Flex的纯AS库SWC组件

五月 22nd, 2008 | 1 Comment , 1 views | Posted by flashlizi in Flex3

1、下载ExportSWC插件,解压到FD的Plugins目录,重启FD,在导航栏上会出现Export SWC的图标。
2、新建一个AS3的Default Project,在项目文件夹下会出现bin和src两个文件夹,删除src目录下Main.as。
3、打开project的properties面板,在classpaths里添加你想编译的as类库的目录。
4、在compiler options面板的Additional compiler options项里输入如下compc编译参数:
-namespace http://schemas.riaidea.com/as3lib/ manifest.xml -include-namespaces http://schemas.riaidea.com/as3lib/ -compute-digest=false
其中namespace和include-namespaces指定编译类库的命名空间,在这里你可以修改为你想要的命名空间。manifest.xml是你的as类库清单,它的具体写法请参看这里
5、点击Export SWC的按钮,即会在bin目录下生成一个swc文件,至此大功告成。

更新:最新版本的ExprotSWCPlugins

Official Flash Player 10(Astro) Documentation

五月 22nd, 2008 | No Comments , 582 views | Posted by flashlizi in Flash CS3/AS3

Download: Official Flash Player 10 Documentation
Extended read:
Flash Player 10 Drawing API

Google's Javascript Library and Doctype

五月 15th, 2008 | 1 Comment , 949 views | Posted by flashlizi in Javascript

对于web developer而言,google的技术绝对具有吸引力。今天google发布了一个叫goog的javascript库,而且还发起了一个叫Doctype的项目,goog也是其中的一部分。此项目旨在为开发者开发web应用提供一个百科全书式的参考。内容包括:web安全文章,Jvascript DOM控制,CSS技巧,DOM/HTML/CSS参考等。而“By web developers, for web developers”的理念,允许更多的开发者参与到这个项目中来,不断完善和发展。

WebORB:整合Flash/Flex与服务端的通讯平台

四月 28th, 2008 | No Comments , 729 views | Posted by flashlizi in Flex3

WebORB是一个免费的整合Flash/Flex与服务端(.NET/Java/Ruby/PHP)的通讯平台,它对AMF0,AMF3,RTMP,XML都有很好的支持。特别是.NET平台,推荐使用WebORB。

让timer事件不延迟第一次调度

四月 23rd, 2008 | No Comments , 1 views | Posted by flashlizi in Flash CS3/AS3

一般启动Timer对象创建计时器后,都要经过Timer.delay的延迟后才会第一次调度timer事件。不过有些时候,我们想不经过delay就第一次调度timer事件,因此我们可以扩展Timer类来实现:

package {
import flash.utils.Timer;
import flash.events.TimerEvent;
public class MyTimer extends Timer {
private var startDelay:Boolean;
public function MyTimer(delay:Number, repeatCount:int = 0, startDelay:Boolean = true) {
this.startDelay = startDelay;
super(delay, repeatCount);
}
public override function start():void {
if (!startDelay) dispatchEvent(new TimerEvent(TimerEvent.TIMER));
super.start();
}
}
}

使用方法:
//传入startDelay为false即不延迟调度timer事件
var timer:MyTimer = new MyTimer(1000, 5, false);
timer.addEventListener(TimerEvent.TIMER, timerHandler);
timer.start();

需要注意的是,不延迟第一次调度timer事件不会计入到计时器的总运行次数repeatCount的。即调度完第一次timer事件后,currentCount仍为0。

Flex SDK coding conventions and best practices

四月 16th, 2008 | No Comments , 642 views | Posted by flashlizi in Flex3

Adobe Open Source上发布的Flex SDK编程规范与实践。内容包括命名、编程惯用法、文件组织管理、代码格式、项目文档ASDoc等一系列的规范。致力于Flex/Flash开发的朋友都值得一看,这有助于你进行效率更高,可读性更好的开发。

URL: http://opensource.adobe.com/wiki/display/flexsdk/Coding+Conventions

再推荐一篇关于FMS3的文章:Dynamic stream switching with Flash Media Server 3

PHPQuery: A Simple AS3 Warper of AMFPHP

三月 25th, 2008 | No Comments , 692 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 , 673 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使用文档