第一章 语法基础 第一节 对象或变量的声明 ======================================================== 声明变量及对象方法 声明时最好有意识地使用AS2.0中的强化输入法 在对象或变量名后用 :类型 ,以告诉编译器该对象或变量的类型,有助于编译器在编码出错时及早发现问题并报告. var 对象或变量名:类型 = new 对象()/值 1.Flash基本数据类型: [类型名称 类型标识符 声明方法 ] 字符串类型 ====================================== String var 变量名:String = new String(字符串) 或简写 var 变量名:String = 字符串 数值类型 ====================================== Number var 变量名:Number = 数值 布尔类型 ====================================== Boolean var 变量名:Boolean = true/false undefined和null undefined是未定义的对象或变量 null是空值,编写类的时候,良好的开发习惯是主动将已声明但没有初值的变量赋为null 第二节 运算符及流程控制 ======================================================== 常用运用符 + - * / 基本运算符 加减乘除 ++ -- 单目运算符,自加1 自减1,注意其位置的不同,如果与表达式混用,在前是先对变量运算再计入表达式(此操作影响表达式结果),在后是先计入表达式再对变量运算(此操作不影响表达式结果),在单独运用的情况,在前在后都没所谓. += -= *= /= 加/减/乘/除等 其形式与 x=x+值 x=x-值 x=x*值 x=x/值 一样,属于简写,因其方便,所以多采用此写法. ? : 条件运算符 逻辑表达式?结果1:结果2 根据逻辑表达式的值,返回不同的结果, 结果1(true):结果2(false) 常见用于操作时间的前导加0 Hour.length == 1 ? "0" + Hour : Hour &&逻辑与 ||逻辑或 !逻辑非 ==等于 !=不等于 <=少于等于 >=大于等于 &按位与 |按位或 <<按位左移 >>按位右移 单个是按位操作 与上面的逻辑操作符不同 位运算符常见于操作颜色数值,使用位运算符时会将操作数自动化为二进制数再进行操作 一个十六进制的颜色值(如0xFF0000)一般可以对应化为24位的二进制数, 因为这32位二进制数对应是 8位(红) 8位(绿) 8位(蓝),所以如果要单独提取则是 红 0xFF0000 >>16 & 0xFF (全体向右移动16位,然后与0xFF作按位与运算) 绿 0xFF0000 >>8 & 0xFF (全体向右移动8位,然后与0xFF作按位与运算) 蓝 0xFF0000 & 0xFF (全体与0xFF作按位与运算) 合成颜色值(与分离色值的操作相反,在构造setColor时就要用到这个) var R:Number = 128 var G:Number = 24 var B:Number = 189 var RGB:Number = R<<16 | G<<8 | B 将色值按位置进行移位并使用按位与运算符合并 程序流程控制 使用for in比直接使用for操作数组将得到更佳的性能 第三节 函数的使用 ======================================================== 构造形式 function 函数名(形参:数据类型):函数返回类型{ //函数体 } 函数形参默认情况下有一个arguments对象,其内包含所有传入的参数对(包括没声明的形参数量) arguments对象有两个属性:caller和callee caller返回调用函数的宿主函数名 callee返回当前函数的实体引用,常用于匿名函数的递归 如函数无返回类型的,则使用Void类型 如函数有返回类型的,必须在函数尾部使用 return 返回值. 匿名函数与正常函数不同之处是 没有函数名,结尾有一个分号 概念补充: 对场景的引用, _root 指代主场景,尽可能少直接使用,此属于绝对定位 _parent 指代上一级场景,此属于相对定位 this 指代当前场景,可与_parent配合使用,如 this._parent 第二章 对象入门 实例化对象方法 var 对象名:类名 = new 类名() 可以为动态类或对象添加自定义属性或方法 对象名.自定义属性 = 值 对象名.自定义方法 = function(){ //方法体 } 这个常用于韩国式弹性菜单中,用于标识当前影片剪辑的id,在for循环体内,一般写成: this["mc"+i].id 如果想当然地在on处理事件中使用for循环的当前值,则会永远是for循环的终结值 关联数组 ======================================================== Flash中所有类的基类是 Object Object一般多用于构造关联数组(哈希表) 比如在函数中,如果需要传入大量参数,则使用对象比直接单独声明多个形参更方便. 应用形式: var 对象:Object = new Object(); 对象.属性 = 值 对象.属性2 = 值2 对象.属性3 = 值3 与函数一样,除了有实名函数外,还有匿名函数,而匿名的对象则叫对象文本,一般应用于不需要显式声明对象的函数中, 如duplicateMovieClip函数的形参中,有一个init的形参是可选的 构造方法: {属性:值,属性2:值2,属性3:值3} 注意:对象文本的概念在学习初期可能没法体现,但到后期当深入应用带有 初始对象的函数时就会明白其使用了 比如: for (i=0; i<9; i++) { //mc.duplicateMovieClip("mc"+i, this.getNextHighestDepth(), {_x:i%3*(mc._width+10),_y:int(i/3)* mc.duplicateMovieClip("mc"+i, 1, {_x:i%3*(mc._width+10),_y:int(i/3)*(mc._height+10)}); } 这个是复制九宫格的代码 {_x:i%3*(mc._width+10),_y:int(i/3)*(mc._height+10)} 这句可以简单看为{_x:值,_y:值} 其实就是等同 for (i=0; i<9; i++) { mc.duplicateMovieClip("mc"+i, 1) this._x=i%3*(mc._width+10) this._y=int(i/3)*(mc._height+10) } 从这里就看出使用对象文本的优势了 访问关联数组值 =============== 有两种方法可以访问关联数组, 1:点语法 对象.属性 2.数组访问符 对象[关键字] 使用数组访问符的优势所在是,点语法不能使用文本组合,而数组访问符可以, 比如循环同步读取三个对象的同一属性,可使用 for(i=1;i<4;i++){ trace(this["对象"+i].属性) } 因为对象也属性场景的关联数组中的一个对象 所以同理可以用场景的this _root _parent来访问 而使用点语法 就不能使用字符串连接的方式来访问对象了 for(i=1;i<4;i++){ //trace("对象"+i.属性) //这样的代码是错误的 } 类 ======================================================== 类路径 所有类都应该编写定义在外部的as文件中,默认情况下,flash会优先在FLA工程的保存目录下搜索类文件 或者在 编辑>首选参数中 设置全局类路径 创建类 ========================= class 类名{ } 定义类属性 ========================= private _属性名:数据类型 私有属性建议使用_下划线开头 定义类属性获取函数、设置函数 ========================= 定义私有属性的原因为就为了保证设置数据的合法性,而提供对私有属性间接访问的方法就是 为属性定义获取及设置函数 获取函数 public function get 属性名():数据类型{ return 私有属性值; } 设置函数 public function set 属性名(value:数据类型):Void{ 私有属性 = value;j } 构造函数 ========================= function 类名(形参:数据类型){ } 类静态属性、静态方法 ========================= static public/private var 属性:数据类型 = 值 static public/private function 方法名(形参:数据类型):返回类型{ } 类包的声明及导入类包 ========================= class 类包路径{ } import 类包路径 扩展类 ========================= 继承: class 类名 extends 父类{ } 接口: interface 接口名{ } 实现接口: class 类名 implements 接口名{ } 动态类: dynamic class 类名{ } 第六章:调试和错误处理 =========================== try{ throw new Error(["message"]); //显式抛出异常 } catch(erObject:Error){ //异常处理 //erObject.message //erObject.name } finally{ } 第七章:数组 =========================== 构建方法: var 数组名:Array = new Array(); 简写:var 数组名:Array = []; var 数组名:Array = new Array(长度:Number); var 数组名:Array = new Array(元素1,元素2,元素n); 简写: var 数组名:Arry = [元素1,元素2,元素n]; 第十三章:显示对象 MovieClip =========================== _root _parent this 使用数组运算符访问对象 _root[] _parent[] this[] 保持四角缩放比例 import flash.geom.Rectangle; MC.scale9Grid = new Rectangle(左上角x座标,左上角y座标,矩形宽度,矩形高度); Tween类 ================================== import mx.transitions.Tween; import mx.transitions.easing.*; var tw:Tween = new Tween(MC,"属性",效果,实例值,目标值,帧/时间,帧/秒) Back, Bounce, Elastic, Regular, Strong easeIn, easeOut, easeInOut 复制MC: mc.duplicateMovieClip(新名,层级) 附加MC: mc.attachMovieClip(链接名,新名,层级,[初始化]) 创建空白MC: mc.createEmptyMovieClip(新名,层级,[初始化]) 删除MC: mc.swapDepths(0) mc.removeMovieClip(); 拖动: this.startDrag(true); this.stopDrag(); 遮罩: setMask(null) 座标空间转换: globalToLocal(对象) localToGlobal(对象) 缓存位图表面: mc.cacheAsBitmap = true; 第十五章:用程序Drawing API绘图 ======================================== mc.beginFill(颜色,alpha) mc.lineStyle(粗细,颜色,alpha) mc.moveTo(_x,_y) mc.lineTo(_x,_y) mc.endFill() 绘制曲线: mc.curveTo(控制点x座标,控制点y座标,目标点x座标,目标点y座标) 第十七章:应用滤镜 ======================================== import flash.filters.BlurFilter; //新建滤镜对象 myBlurdata = new BlurFilter(0, 0, 1); var myFilters:Array = main.filters; myFilters.push(myBlurdata); myFilters[0].blurX = Math.abs(Math.floor((main.oid-1)*-256+256-main._x)/4); main.filters = myFilters; 第十八章:位图API ======================================== import.display.BitmapData; var 对象:BitmapData = new BitmapData(宽度,长度,是否透明,填充色) 加载库 var 对象:BitmapData = BitmapData.loadBitmap(链接标识符); 显示对象 mc对象.attachBitmap(位图对象,层级) import flash.display.BitmapData; this.createEmptyMovieClip("myMC",this.getNextHighestDepth()) this.createEmptyMovieClip("myMC2",this.getNextHighestDepth()) var myLoader:MovieClipLoader = new MovieClipLoader() var oListener:Object = new Object() oListener.onLoadInit = function(){ var myBMP:BitmapData = new BitmapData(myMC._width,myMC._height) myBMP.draw(myMC) myMC2.attachBitmap(myBMP,1) myMC2._y = 100 } myLoader.addListener(oListener) myLoader.loadClip("http://eiv.baidu.com/maimg/20080618/104161828.jpg",myMC) var MCLoader对象:MovieClipLoader = new MovieClipLoader(); var 侦听obj:Object = new Object(); 侦听obj.onLoadProgress = function(target_mc:MovieClip, loadedBytes:Number, totalBytes:Number) { trace(loadedBytes); } MCLoader对象.addListener(侦听obj); MCLoader对象.loadClip(加载URL, 对应影片剪辑实例名); 第十九章:TextField类 ======================================== createTextField(实例,深度,_x,_y,_width,_height) 应用Selection对象 getBeginIndex getEndIndex 第二十章:TextFormat类 ======================================== 应用样式表 var 样式对象:TextField.StyleSheet = new TextField.StyleSheet(); 样式对象.setStyle(标识,{样式对象文本}) 标识:常规html标签 或自定义以句号开头的标签(同时必须显示在标签中使用 class属性定义使用的样式) 文本对象.styleSheet = 样式对象; 第二十二章:使用舞台 ======================================== Stage.scaleMode = 缩放模式:String (showAll 显示全部 noBorder 无边框 exactFit 精确匹配 noScale 无缩放) Stage.align = 对齐方式:String (L 左 R 右 T 上 B 下 LT 左上 LB 左下 RT 右上 RB 右下) 检测播放器窗体大小变化事件: onResize 第二十三章:ContextMenu类 ======================================== var CtM:ContextMenu = new ConttextMenu([初始函数]) CtM.hideBuiltIntems(); var CtMI:ContextMenuItem = new ContextMenuItem(文字,函数) Ctm.customItems.push(CtMI); this.menu = CtM 第二十四章:capabilities和security对象 ======================================== 访问剪贴板 System.setClipboard(字符) 显示设置面板 System.showSetting([数字]) 第二十七章:管理视频 ======================================== 添加Video对象,在库中,赋实例名. var Nct对象:NetConection = New NetConection(); Nct对象:connect(null); var Ns对象:NetStream = new NetStream(Nct对象); Ns对象.play(FLV路径); Video对象.attachVideo(Ns对象); 检查状态结息; Ns对象.onStatus = function(oData:Object):Void{ trace(oData.code); } 检索元数据: Ns对象.onMetaData = function(oMetaData:Object):Void{ trace(oMetaData.duration); } 第二十八章:使用UI组件 ======================================== 首先在库中添加组件实例 this.createObject(组件名,新名,层级) this.createClassObject(类名,新名,层级) 类名一般 mx.controls.组件类 删除运行时组件实例 this.destroyObject(类例名) 移动组件 组件名.move(x,y) 调整大小 组件名.setSize(w,h) 第三十一章:本地共享对象 ======================================== var 共享对象:SharedObject = sharedobject getlocal(名称); 共享对象.data.属性 = 值 共享对象.flush([指定大小]); 共享对象.getSize(); 检测对象是否存在 var a:Boolean = false for(item in 共享对象.data){ a = true; break; } if(a){ // } 第三十二章:LocalConnection对象 ======================================== 发送方影片 var local对象:LocalConnection = new LocalConnection(); Local对象.send(连接名:String,调用方法:String,[参数]_ Local对象.onStatus = function(oStatus:Object):void{ //发送状态,oStatus:Object > level属性[status / error] } //回调响应 Local对象.方法名 = function():void{ // } Local对象.connect(侦听连接名) 接收方影片 var Local对象:LocalConnection = new LocalConnection() Local对象.方法名 = function([参数]){ //回调 this.send(连接名,调用方法,[参数]); } Local对象.connect(侦听连接名) 跨域发送与调用 发送方 send方法连接名前加域,如:(kgbbs.cn:连接名) 或连接名以下划线开始,超域. 接收方 响应发送方对应域请求,响应使用相同下划线侦听连接名的超域调用. //自动调用的方法 Local对象.allowDomain = function(sDomain:String):boolean{ //判断 sDomain的合法性 return(sDomain == 指定域:Strint) } //停止侦听连接 Local对象.close(); 第三十三章:XML类、LoadVars类 ======================================== var xml对象:XML = new XML(); xml对象.onLoad = function(Success:Boolean):Void{ if(Success){ // } else { // } } xml对象.load("xml地址") 跨域共享数据 1.创建crossdomain.xml 2.DNS别名 3.代理服务器脚本 第三十八章:JavaScript ======================================== import flash.external.ExternalInterface; Externa(Interface.call(函数名:String,参数:String) // ExternalInterface.addCallback(调用名:String,作用域(this),函数名)