Browse > Home > Archive: 五月 2007

| Subcribe via RSS

AIR应用程序描述符(AIR application descriptor)介绍

五月 19th, 2007 | No Comments , 867 views | Posted by flashlizi in Adobe AIR

AIR应用程序描述符(AIR application descriptor)文件,即application.xml。它包含了整个程序的全部属性,名称、版本、版权等等。描述符文件名可以是任意的,比如flashrek.xml,但是当你用flex builder或者ADT打包编译成AIR文件的时候,它们会把它重命名为application.xml。

下面是一个描述符文件的例子(application.xml):
[code]<?xml version="1.0" encoding="utf-8" ?>
<application appId="com.flashrek.air.examples.HelloAIR" version="1.0"
xmlns="http://ns.adobe.com/air/application/1.0.M4">
<name>AIR Hello</name>
<description>
This is the Hello AIR sample file.
</description>
<title>Hello AIR -- www.flashrek.com</title>
<copyright>Copyright © 2007</copyright>
<rootContent systemChrome="standard"
transparent="true"
visible="true"
width="640"
height="480">
HelloAIR.swf
</rootContent>
<installFolder>flashrek/Examples</installFolder>
<icon>
<image16x16>icons/smallIcon.png</image16x16>
<image32x32>icons/mediumIcon.jpg</image32x32>
<image48x48>icons/bigIcon.gif</image48x48>
<image128x128>icons/biggestIcon.png</image128x128>
</icon>
</application>[/code]

下面来介绍一下ARI程序的一些基本属性。
1、appId:唯一的程序标识符,在重新安装或更新的时候,会据此来判断是否安装过此AIR。它可使用的字符限制在这几种字符:[0-9][a-z][A-Z][.][-] 。
2、version:用来指定程序的版本。如:"1.0", ".4", "0.5", "4.9", "1.3.4a"。
3、xmlns:AIR的名字空间(namespace)。它必须根据每次AIR的版本更新来进行相应的改变。
4、name:定义程序的名称,它会出现在程序的窗口标题和windows的开始菜单中,必需元素。
5、title:显示在AIR程序的安装程序中的标题,可选元素。
6、description:显示在AIR程序的安装程序中的介绍,可选元素。
7、copyright:定义AIR程序的版权信息,可选元素。
8、installFolder:指定AIR程序在默认安装目录下的子目录,可选元素。
9、rootContent:指定AIR程序的启动文件,它可以是一个swf或html文件,必需元素。
10、systemChrome:指定AIR程序的外观。它有2个值:standard,显示系统程序外观,如边框、标题等,且不包含透明值;none,不显示系统程序外观,这样可以定制出自己的程序外观。
11、transparent:指定程序是否支持透明模式(alpha blending)。设置为true后,程序会增加内存消耗,可能造成程序窗口绘制速度变慢,并且systemChrome必须设置为none。
12、visible:设置为false可以让程序主窗口在第一次创建的时候就隐藏。你可以让你的主窗口在初始化的时候隐藏,在程序代码中设置窗口的大小和位置后,你可以在代码中通过设置stage.window.visible为true来重新显示窗口。
13、width和height:指定程序主窗口的宽度和高度。如果你不设置它们,主窗口的宽高将由rootContent中指定的swf文件的宽高来决定,如果rootContent中指定的是html文件,则取决于操作系统。
14、icon:指定程序使用的图标文件,可选元素。文件路径与程序的根目录相关,支持PNG, GIF, and JPEG等格式图片文件,并且必须与指定的尺寸相符,比如image48×48标签下的icon尺寸必须是48×48的。但是,你可以不全部指定所有尺寸的图标。比如只指定image128×128的icon,系统则会自动从最靠近的尺寸的icon来进行缩放使用。

【从AS2到AS3之二】访问控制以及命名空间

五月 10th, 2007 | No Comments , 586 views | Posted by flashlizi in Flash CS3/AS3

在AS2中我们已经知道有public, private这2个访问控制符,在AS3中增加了internal和protected,并且对类、方法的访问控制更加严格,也更加合理和方便。另外,AS3中还增加了命名空间namespace,这样我们的访问控制更是灵活无比。(public和private相信大家已经熟悉了,故不赘述)

internal指明类、变量、常数、方法等在包package级别可访问到。大家可能会问它和public与private的区别。public只能在package{}中才能使用,但public控制的类或方法可以在任何地方访问到;private只能在class{}中才能使用,它控制的类或方法仅能在相应的class中才能访问到。而internal可以在package{}外使用,但它只能作用于这个as文件内部。比如如下DDD.as中代码为:
[code]
package flashrek.example{
public class DDD {
function DDD() {
var e:EEE=new EEE();

}
}
}
internal var internalStr:String="internalStr";
class EEE {
function EEE() {
trace(internalStr);
}
}
[/code]
那么如下代码运行结果为:
[code]
import flashrek.example.DDD;
var d=new DDD();//输出:internalStr
trace(internalStr);//输出:错误Err
[/code]
可以看出,类DDD可以访问到package外的类EEE(默认就是internal,因此可以省略),而类EEE也可以访问到变量internalStr。而DDD.as文件外的其他地方就无法访问到EEE和internalStr了。

和internal不同,protected只能应用与类class内。它指明变量、常数、方法等在类class级别可访问到。与private区别在于,protected指定的方法、变量等是可以继承的,在子类中能访问到他们。

AS3中还引入了命名空间namespace。当你有一些有特殊用途的方法分布在不同的包package里,你想要这些方法在所有package里都可以应用,但你又不想把这些方法设置为public。这个时候,namespace就能达到你的目的。

首先你要定义一个namespace,(flashrek.as):
[code]
package flashrek.example{
public namespace flashrek= "www.flashrek.com";
}
[/code]

然后在AAA.as文件中的代码为:
[code]
package flashrek.example{
import flashrek.example.flashrek;
public class AAA {
function AAA() {
var b:BBB=new BBB();
//flashrek::NStest();
}
flashrek function NStest() {
trace("namespace test");
}
}
}
//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。
//package外是不能使用public关键字的。
internal class BBB {
function BBB() {
trace("BBB");
var c:CCC=new CCC();
}
}
class CCC {
function CCC() {
trace("CCC");
}
}
[/code]
接下来再看运行结果:
[code]
import flashrek.example.AAA;
import flashrek.example.flashrek;
var a=new AAA();
a.flashrek::NStest();
//输出:
BBB
CCC
namespace test
[/code]
由此我们可以看出,通过a.flashrek::NStest();这样的方法,我们可以访问到NStest方法,而其他地方是无法直接访问到这个方法的。

在上例中大家发现,namespace很像一个类。确实有点像:)但namespace可以在package外,class内进行定义,而且也可以用public、internal等来进行访问控制。
比如去掉上例中的flashrek.as,而把AAA.as改成如下:
[code]
package flashrek.example{
public class AAA {
function AAA() {
var b:BBB=new BBB();
flashrek::NStest();
}
flashrek function NStest() {
trace("namespace test");
}
}
}
//package外的类、命名空间不能默认且只能是internal的,且仅能为在此package内使用。
//package外是不能使用public关键字的。
namespace flashrek= "www.flashrek.com"
internal class BBB {
function BBB() {
trace("BBB");
var c:CCC=new CCC();
}
}
class CCC {
function CCC() {
trace("CCC");
}
}
[/code]
在这里namespace flashrek定义在package外,它只能在package级别访问到。因此用a.flashrek::NStest();是错误的。

【从AS2到AS3之一】常量&操作符&参数

五月 6th, 2007 | No Comments , 811 views | Posted by flashlizi in Flash CS3/AS3

随着Flash CS3正式版的发布,估计很多朋友都开始从AS2迁移到AS3了。不过AS3比AS2改变的实在太多,在as2中很多方法属性在as3中并不相同,甚至消失,而且目前帮助文档是E文的,现下的as3基础文章也并不多,因此特开此贴,集合一些基础性的要点,尽量以例子来说明,让大家更快更好的往AS3迁移。文中如有错误,敬请指正。有兴趣的朋友也可以一起来添加。

1、常量
先看AS2代码:
[code]var str:String;
var num:Number;
var boo:Boolean;
var obj:Object;
var notyped;
trace(str+newline+num+newline+boo+newline+obj+newline+notyped);
//return
undefined
undefined
undefined
undefined
undefined[/code]

再看AS3代码:
[code]var str:String;
var num:Number;
var boo:Boolean;
var obj:Object;
var notyped;
trace(str+"\n"+num+"\n"+boo+"\n"+obj+"\n"+notyped);
//return
null
NaN
false
null
undefined[/code]

从上面2个例子可以清楚的看到:在as2中String、Number、Boolean、Object的默认值都是undefined,而在as3中则分别为null、NaN、false、null。只有未作申明的变量的默认值才是undefined。因此,在as2中一个"undefined"打天下的时代已经过时了,在as3中更加明确。同时as2中还有一个常量newline在as3中已经取消,由"\n"替换。另外特别说明就是trace方法的功能也加强了,参数个数不限,因此上面可以改成trace(str,num,boo,obj,notyped)了。

2、操作符
这里只讨论instanceof。虽然as3中还保留了这个操作符,但as3中推荐用is代替它。而且is的用法更为灵活。看如下代码:
[code]var mystr:String="test";
var mytest:Test = new Test();//Test is extends SuperTest
trace(mytest instanceof SuperTest); //AS2 return false //AS3 return true
trace(mystr instanceof String);//AS2 return false
trace(mystr instanceof String);//AS3 return true
trace(mystr is String);//AS3 return true[/code]

从此例可以看出instanceof在as3中的比as2中有了变化。在as2中instanceof不会将原始类型转换为包装对象,因此在上面例子中的String验证中返回false,并且它对超类(如SuperTest)不起作用。而在as3中它只检查原型链,所以在第一个trace中会返回true。但是as3中instanceof并不支持接口,而is支持。[code]var mytest:Test = new Test();//Test implements InterfaceTest
trace(mytest is InterfaceTest); //AS3 return true
trace(mytest instanceof InterfaceTest); //AS3 return false[/code]

至于add、eq、gt、ge、<>、and、not、or、ne、lt、le等AS1的语法在as3中统统取消了。

3、参数
在AS3中增加了一个… (rest)这样的参数。它的作用是指明函数可以接收任意多个以逗号分隔的参数。[code]function testfun1(param0, param1, ...arg)
{
trace(arg is Array,arg,arg.length);
}
testfun1("param0","param1","param2","param3");
//return: true param2,param3 2 [/code]

在这里…arg表示一个名为arg的数组。当运行testfun1后,arg=["param2","param3"]。还记得function有个arguments类么,当使用了…(rest)后,argumnets就无法获取了。但是如上例所示arg.length同样可以使用。但是并没有类似arguments.callee的这种方法,所以要使用…arg的时候确保不会使用arguments.callee的方法。