2007年2月3日星期六

ActionScript 3 Cookbook 中文版

ActionScript 3 Cookbook 中文版

本文未经同意,谢绝转载

第一章. ActionScript 语言基础

第二章. 自定义类

第三章. 运行时环境

第四章. 数字和数学

第五章. 数组

第六章. 可视化对象列表 (目录)

第七章. 绘图和遮罩 (目录)

第八章.位图 (目录)

第八章.位图

第八章.位图


8.0.简介

8.1.创建BitmapData对象

8.2.添加位图到可视化对象列表

8.3.绘制可视化对象到位图上

8.4.载入外部图片到位图上

8.5.处理象素

8.6.创建矩形填充

8.7.创建一个充溢填充

8.8.拷贝象素

8.9.拷贝通道

8.10.创建噪波

8.11.创建布林噪波

8.12.使用阈值

8.13.在位图上应用滤镜

8.14.在两幅位图之间转换

8.15.滚动位图

2007年1月22日星期一

第五章.数组


第五章.数组



5.16.读取联合数组


5.16. 读取联合数组

问题
我要怎样遍历联合数组
解决办法
使用 for . . . in 语句
讨论

基于整形下标的数组可以通过for 语句进行循环遍历,但是,用关键字作索引的联合数组就不能这样遍历了,还好,联合数组可以通过 for . . . in 语句进行遍历访问。该语句会访问指定对象所有可用的属性,语法如下:
for (key in object) {
// Actions
}
for . . . in 语句不需要循环变量更新语句,决定循环次数的是对象的属性个数。注意这key 就是存储每个属性名称的:
var members:Object = new Object( );
members.scribe = "Franklin";
members.chairperson = "Gina";
members.treasurer = "Sindhu";

// 使用 for . . . in 语句遍历所有元素
for (var sRole:String in members) {
// 显示:
// treasurer: Sindhu
// chairperson: Gina
// scribe: Franklin
trace(sRole + ": " + members[sRole]);
}


5.15.创建联合数组


5.15. 创建联合数组

问题
我要创建用名称元素作为索引的数组
解决办法
创建联合数组
讨论

用联合数组其每个元素都有特定的含义,这一点原来的数组类型是做不到的。
var aMembers:Array = new Array("Franklin", "Gina", "Sindhu");
联合数组在其他的语言叫做哈希表,在 ActionScript 里它就是Object 类的一个实例,联合数组使用名称元素来代替数字下标,该名称也被称为关键字或属性,说关键字更好理解些,它关联了元素值,两者一一对应。
创建联合数组不是用Array 类而是Object类创建的,它就是 Object 类的一个实例,理论上 Object 类是任何类的基类。所有的对象都能作为联合数组,但是除非有特殊需要,最好还是用 Object 类创建。
用{ } ,而且用逗号分开每个键值对,键值对之间用:,像下面:
var memebers:Object = {scribe: "Franklin",
chairperson: "Gina",
treasurer: "Sindhu"};
也可以像下面那样创建联合数组:
var members:Object = new Object( );
members.scribe = "Franklin";
members.chairperson = "Gina";
members.treasurer = "Sindhu";
有两种方法访问联合数组内容,一种是通过访问属性名称(关键字):
trace(members.scribe); // 显示: Franklin
另一种就像数组那样,把关键字作为下标来访问,用[ ] 符号:
trace(members["scribe"]); // 显示: Franklin
这种方式更加灵活,可以在数组中进行遍历,对于动态生成的关键值和内容这种访问方式是最好的,例如:
var members:Object = new Object();
members.councilperson1 = "Beatrice";
members.councilperson2 = "Danny";
members.councilperson3 = "Vladamir";
for (var i:int = 1; i <= 3; i++) {
trace(members["councilperson" + i];
}

数组访问方式在循环语句里经常用到:
var members:Object = new Object( );
members["councilperson"] = "Ruthie";
trace(members.councilperson); // 显示 Ruthie
members.councilperson = "Rebecca";
trace(members["councilperson"]); // 显示: Rebecca


5.14.比较数组


5.14. 比较数组

问题
我该怎么知道两个数组是否相等呢
解决办法
循环数组,一一比较对应位置的每个元素
讨论

因为数组是引用类型,使用=操作符只能对比引用是否指向同一内存空间,如:
var letters:Array = ["a", "b", "c", "d"];
var lettersPointer:Array = letters;
trace(letters == lettersPointer); // 显示: true
但是如果数组内容相同,但是在不同的内存空间,=操作就会返回false:
var letters1:Array = ["a", "b", "c", "d"];
var letters2:Array = ["a", "b", "c", "d"];
trace(letters1 == letters2]; // 显示: false
因此,比较数组应该比较数组的每个元素是否相等:
var equivalent:Boolean = true;
for(var i:int = 0; i < letters1.length; i++) {
if(letters1[i] != letters2[i]) {
equivalent = false;
break;
}
}
trace(equivalent); // 显示: true
另外还可以用ArrayUtilities.equals( ) 方法,该方法需要两个参数:两个数组引用,返回布尔值说明是否相等:
var letters1:Array = ["a", "b", "c", "d"];
var letters2:Array = ["a", "b", "c", "d"];
trace(ArrayUtilities.equals(letters1, letters2));
// 显示: true
默认,两个不同排列的数组是不相等的,除非提供第3个参数为true表示忽略数组排列顺序:
var letters1:Array = ["a", "b", "c", "d"];
var letters2:Array = ["b", "a", "d", "c"];
trace(ArrayUtilities.equals(letters1, letters2));
// 显示: false
trace(ArrayUtilities.equals(letters1, letters2, true));
// 显示: true
equals( ) 方法用起来很简单,下面是它的代码:
public static function equals(arrayA:Array,
arrayB:Array,
bNotOrdered:Boolean):Boolean {

// 如果两个数组长度不同
if(arrayA.length != arrayB.length) {
return false;
}

// 创建拷贝,不影响原数组
var arrayACopy:Array = arrayA.concat( );
var arrayBCopy:Array = arrayB.concat( );

// 如果忽略排列顺序
if(bNotOrdered) {
arrayACopy.sort( );
arrayBCopy.sort( );
}

// 循环比较
// 如果不匹配,删除拷贝,返回false
for(var i:int = 0; i < arrayACopy.length; i++) {
if(arrayACopy[i] != arrayBCopy[i]) {
delete arrayACopy;
delete arrayBCopy;
return false;
}
}

// 否则相等,删除数组,返回true
delete arrayACopy;
delete arrayBCopy;
return true;
}


5.13.取得数组元素的最大值和最小值


5.13. 取得数组元素的最大值和最小值

问题
我要获取数字数组的最大和最小元素
解决办法
经过数字排序,然后读取数组的第一个和最后一个元素
讨论

要想快速的取得最大值和最小值,先进行排序,看下面:
var scores:Array = [10, 4, 15, 8];
scores.sort(Array.NUMERIC);
trace("Minimum: " + scores[0]);
trace("Maximum: " + scores[scores.length - 1]);
如果不破坏原有数组顺序,可先复制数组:
也可使用 ArrayUtilities.min( )ArrayUtilities.max( ) 方法。