Flex及AS3的百条常用知识(转载)
发布时间:2020-12-15 01:18:40 所属栏目:百科 来源:网络整理
导读:【改变输出swf的尺度,背景颜色或帧频】 在"Navigator"窗框里右键你的项目选中"Properties"选中"ActionScript Compiler"在"Additional compiler arguments"里输入你所需要的命令 如想改变背景颜色,请输入: -default-background-color 0xffffff 【鼠标坐标】 m
【改变输出swf的尺度,背景颜色或帧频】
在"Navigator"窗框里右键你的项目>选中"Properties">选中"ActionScript Compiler">在"Additional compiler arguments"里输入你所需要的命令 如想改变背景颜色,请输入: -default-background-color 0xffffff 【鼠标坐标】 mouseX mouseY 【检查变量类型并返回布尔值】 is 【检查变量类型并返回类型】 typeof 【检查对象类型并返回该对象】 as 【是数字但不是有效数字问题】 var quantity:Number = 15 - "rabbits"; trace(typeof quantity); //显示: "number",但它是NaN (not a number) trace(quantity is Number); //true trace(quantity != NaN); //false //使用isNaN()函数检测: isNaN(quantity); //true //检测变量是否内含有效数字: !isNaN(quantity); //false 【取消默认的严格编译模式】 在"Navigator"窗框里右键你的项目>选中"Properties">选中"ActionScript Compiler">取消"Enabel compile-time type checking"选项 【基元数据类型和复杂数据类型好比"值类型"和"引用类型"】 基元数据类型类似按值传递: var intOne:int = 1; var intTwo:int = 1; trace(intOne == intTwo); //true 【复杂数据类型类似按引用传递】 var arrayOne:Array = new Array("a","b"); var arrayTwo:Array = arrayOne; trace(arrayOne == arrayTwo); //true //----------------------------------- var arrayOne:Array = new Array("a","b"); var arrayTwo:Array = new Array("a","b"); trace(arrayOne == arrayTwo); //false 【优化逻辑AND(&&)和OR(||)的小知识】 对于逻辑And(&&): ????除非条件表达式的前半部分为真,否则,ActionScript不会再去求算逻辑AND运算符的后半部.如果前半部为假,整个条件表达式一定为假,所以再去求算后半部就没效率了. 对于逻辑OR(||): ????除非条件表达式前半部为假,ActionScript不会再去求算逻辑OR运算符的后半部,如果前半部为真,整个条件表达式一定为真. 总结:使用逻辑AND(&&)时,把结果最可能为false的表达式放到前面;使用逻辑OR(||)时,把结果最可能为true的表达式放到前面. 【Timer类注意事项】 不要认为Timer可以极其准确;使用Timer时间间隔不要低于10毫秒. 【private,protected,internal,public访问权限】 private:只能在类本身内部访问,按惯例,命名私有成员时以下划线"_"开头; protected:可以由类本身或任何子类访问.但这是以实例为基础的.换言之,类实例可以访问自己的保护成员或者父类的保护成员,但不能访问相同类的其它实例的保护成员,命名保护成员时以下划线"_"开头; internal:可以由类本身或者相同包内的任何类访问; public:可以在类内部访问,也可以由类实例访问,或者声明为static时,可以直接从类访问. 【一个函数具有未知个数的参数,用arguments对象或"...(rest)"符号访问它的参数】 注意:使用"...(rest)"参数会使 arguments 对象不可用; private funciton average():void{ ????trace(arguments.length); //输出参数的个数 ????// arguments的类型是:object,但可以像访问数组一样去访问它 ????trace(arguments[1]); //输出第二个参数 } private function average(...argu):void{ ????trace(argu[1]); //输出第二个参数,argu参数名是自定义的. } 【错误处理try,catch,finally】 private function tryError():void{ ????try { ????????trace("测试开始-try"); ????????throwError(); ????}catch(errObject:Error) { ????????trace("错误信息:" + errObject.message); ????????trace("测试结束-catch"); ????????return; ????}finally{ ????????trace("虽然catch里已经有return方法,但位于return方法后面的finally里的代码依然会被执行.其实无论return方法是在try里,还是catch里,finally里的代码始终会被执行"); ????} ????trace("前面已经有return了,此处是不会再执行的.除非没有抛出错误,以使catch里的代码没有被执行"); } private function throwError():void{ ????throw new Error("抛出错误"); } 【for...in与for each...in的区别】 与for...in循环不同的是,for each...in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引). 【命名包路径的小技巧】 ????使用相应于拥有者和相关项目的包名称会比较好.按惯例来讲,包名称的开头应该是逆向的网址名称.例如,如果Example Corp(examplecorp.com)写了一些ActionScript3.0类,就会把所有类放在com.examplecorp包内(或者 com.examplecorp的子包内).如此一来,如果英国有另一家Example Corp(examplecorp.co.uk)也写了一些ActionScript3.0类,只要使用包uk.co.examplecorp,就可确保唯一性. ????当类属于特定应用程序的一部分时,就应该放在该应用程序特定的子包内.例如,Example Corp可能有个应用程序名叫WidgetStore.如果WidgetStore应用程序使用一个名为ApplicationManager的类,则此类就应该放在com.examplecorp.widgetstore包内,或者位于该包的子包内. ????按惯例来说,包名称的开头是小写字母. 【隐式的取出方法(getter)和设定方法(setter)】 public function get count():uint { ????return _count; } public function set count(value:uint):uint { ????if(value < 100){ ????????_count = value; ????}else { ????????throw Error(); ????} } 【确保类是绝不会有子类,使用final】 final public class Example{} 【super关键字的使用】 super(); //父类的构造函数,只能在类实例构造函数内部使用 super.propertyName; //调用父类的属性,属性需要声明为public或protected super.methodName(); //调用父类的方法,方法需要声明为public或protected 【建立常数,使用关键字const而不是var】 static public const EXAMPLE:String = "example"; 【检测播放器版本】 flash.system.Capabilities.version 对于8.5版以前的任何Flash Player版本,这种方法都不适用. 【判断客户端系统】 flash.system.Capabilities.os 【检测播放器类型】 flash.system.Capabilities.playerType 可能的值有: "StandAlone",用于独立的 Flash Player "External",用于外部的 Flash Player 或处于测试模式下 "PlugIn",用于 Flash Player 浏览器插件 "ActiveX",用于 Microsoft Internet Explorer 使用的 Flash Player ActiveX 控件 【检测系统语言】 flash.system.Capabilities.language 【判断用户是否启用了IME(输入法编辑器)】 flash.system.IME.enabled 【检测屏幕的分辨率】 flash.system.Capabilities.screenResolutionX flash.system.Capabilities.screenResolutionY 【把弹出窗口居中的算法】 X = (舞台宽/2)-(窗口宽/2) Y = (舞台高/2)-(窗口高/2) 【控制影片配合Player的方式,包括缩放问题】 stage.scaleMode 可供选择值:flash.display.StageScaleMode 【舞台的对齐方式】 stage.align 可供选择值:flash.display.StageAlign 【隐藏Flash Player的右键菜单】 stage.showDefaultContextMenu = false; 【检测系统是否具有音频功能】 flash.system.Capabilities.hasAudio 【检测播放器是在具有MP3解码器的系统上运行,还是在没有MP3解码器的系统上运行】 flash.system.Capabilities.hasMP3 【检测播放器能 (true) 还是不能 (false) 播放流式视频】 flash.system.Capabilities.hasStreamingVideo 【检测播放器是在支持 (true) 嵌入视频的系统上运行,还是在不支持 (false) 嵌入视频的系统上运行】 flash.system.Capabilities.hasEmbeddedVideo 【检测播放器能 (true) 还是不能 (false) 对视频流(如来自 Web 摄像头的视频流)进行编码】 flash.system.Capabilities.hasVideoEncoder 【显示 Flash Player 中的"安全设置"面板】 flash.system.Security.showSettings(); 可供选择项:flash.system.SecurityPanel 【让其它域的.swf访问本域的.swf】 在本域的.swf文件里加上:flash.system.Security.allowDomain() 或者使用安全策略文件"crossdomain.xml".在Flash 8以前,这个文件必须放在.swf所在域的根目录,现在,你可以使用flash.system.Security.loadPolicyFile(),指定安全策略文件所在的位置.拒绝任何域的做法是在<cross-domain-policy>标签内什么也不填,安全策略文件也支持通用字符 "*": <?xml version="1.0"?> <!-- http://www.mydomain.com/crossdomain.xml --> <cross-domain-policy> ????<allow-access-from domain="www.riahome.cn" /> ????<allow-access-from domain="*.Y-boy.cn" /> ????<allow-access-from domain="210.38.196.48" /> ????<allow-access-from domain="*" /> </cross-domain-policy> 【数字的不同进制之间的转换】 parseInt(str:String,radix:uint = 0):Number 返回十进制的数,参数radix表示要分析的数字的基数.如果省略radix,就默认为10,除非字符串的开头是"0x","0X"或"0": trace(parseInt("0x12")); //设定radix为16,输出:18 trace(parseInt("017")); //设定radix为8,输出:15 或者使用Number,uint和int对象的toString(radix)方法. 【使用Math.round()对一个数取整,四舍五入】 Math.round() trace(Math.round(204.499)); //输出:204 trace(Math.round(401.5)); //输出:402 【使用Math.floor()对一个数向下取整,就是只要整数部分而不理会小数分】 trace(Math.floor(204.99)); //输出:204 【使用Math.ceil()对一个数向上取整,只要小数部分不为零,整数部分就加1】 trace(Math.ceil(401.01)); //输出:402 【产生一个随机数】 使用Math.random()产生一个伪随机数n,其中 0 <= n < 1 【把数字取至最近的小数点位,即指定精确度】 1. 决定你要取的数字的小数点位数:例如,如果你想把90.337取成90.34,就表示你要取到两位小数点位,也就是说你想取至最近的0.01; 2. 让输入值除以步骤1所选的数字(此例为0.01); 3. 使用Math.round()把步骤2所计得的值取成最近的整数; 4. 把步骤3所得的结果乘以步骤2用于除法的那个值. 例如,要把90.337取成两个小数点位数,可以使用: trace(Math.round(90.337/0.01)*0.01); //输出:90.34 【把数字取成一个整数的最接近倍数值】 例1,这样会把92.5取成5的最近倍数值: trace(Math.round(92.5/5)*5); //输出:95 例2,这样会把92.5取成10的最近倍数值: trace(Math.round(92.5/10)*10); //输出:90 【在指定数值范围内获得随机数】 //可取范围:[min,max] private function randRange(min:Number,max:Number):Number { ????var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min; ????return randomNum; } 应用例子: 模拟投银币,即希望得到随机布尔值(true 或 false): randRange(0,1); 模拟投骰子,即希望得到随机六个值: randRange(1,6); 为避免被缓存而需要产生一个独一无二的数字追加在URL尾端,通常最佳方法是取得当前毫秒数. 【弧度(radian)与度数(degree)之间的转换】 从弧度转为度数: degrees = radians * 180 / Math.PI 从度数转为弧度: radians = degrees * Math.PI / 180 【计算两点之间的距离】 勾股定理: c2 = a2 + b2 假设有两个影片剪辑mc1和mc2,则它们两点间的距离c为: var c:Number = Math.sqrt(Math.pow(mc1.x - mc2.x,2) + Math.pow(mc1.y - mc2.y,2)); 【模拟圆周运动】 已知圆心o(x0,y0),半径r和弧度angle,求圆上任意一点P(x,y)的坐标: x = x0 + (Math.cos(angle) * r); y = y0 + (Math.sin(angle) * r); 注意:舞台的x轴正方向水平向右,y轴正方向垂直向下. 【模拟椭圆运动】 已知圆心o(x0,长轴a,短轴b以及弧度angle,y)的坐标: x = x0 + (Math.cos(angle) * a); y = y0 + (Math.sin(angle) * b); 【华氏温度和摄氏温度之间的转换】 华氏温度 = 摄氏度数 * 9 / 5 + 32 摄氏温度 = (华氏度数 - 32) * 5 /9 【公斤与磅之间的转换】 公斤 = 磅 * 2.2 磅 = 公斤 / 2.2 【向数组尾端添加元素】 var array:Array = new Array(); array.push("a","b"); //向数组尾端添加单一元素也可以这样: array[array.length] = "c"; //如果以索引设定的元素不存在,数组本身会自动扩展以包含足够的元素数目.介于中间的元素会被设为undefined: array[5] = "e"; trace(array[4]); //输出: undefined 【向数组开端添加元素】 var array:Array = ["a","b"]; array.unshift("c","d"); trace(array); //输出: c,d,a,b 【删除数组中第一个元素并返回该元素,使用shift()方法】 var letters:Array = new Array("a","b","c"); var firstLetter:String = letters.shift(); trace(letters); //输出: b,c trace(firstLetter); //输出: a 【删除数组中最后一个元素并返回该元素的值,使用pop()方法】 var letters:Array = new Array("a","c"); trace(letters); //输出: a,b,c var letter:String = letters.pop(); trace(letters); //输出: a,b trace(letter); //输出: c 【删除数组中的元素,给数组添加新元素并返回删除的元素,使用splice()方法】 splice(startIndex:int,deleteCount:uint,... values):Array startIndex: 一个整数,它指定数组中开始进行插入或删除的位置处的元素的索引; deleteCount: 一个整数,它指定要删除的元素数量; ... values: 用逗号分隔的一个或多个值的可选列表或数组,此列表或数组将插入到此数组中由 startIndex 参数指定的位置. 【查找数组中第一个相匹配的元素】 var array:Array = ["a","c","d","a","d"]; var match:String = "b"; for(var i:int = 0; i < array.length; i++) { ????if(array[i] == match) { ????????trace("Element with index " + i + " found to match " + match); ????????//输出: Element with index 1 found to match b ????????break; ????} } 【查找数组中最后一个相匹配的元素】 var array:Array = ["a","d"]; var match:String = "b"; for(var i:int = array.length - 1; i >= 0; i--) { ????if(array[i] == match) { ????????trace("Element with index " + i + " found to match " + match); ????????//输出: Element with index 5 found to match b ????????break; ????} } 【把字符串转成数组】 使用String.split()方法: var list:String = "I am YoungBoy."; var words:Array = list.split(" "); //以空格作为分隔符将字符串切割 trace(words); //输出: I,am,YoungBoy. 【把数组转成字符串】 使用String.join()方法: var myArr:Array = new Array("one","two","three"); var myStr:String = myArr.join(" and "); trace(myArr); //输出: one,two,three trace(myStr); //输出: one and two and three 【使用对象数组处理相关数据】 var cars:Array = new Array(); cars.push({make:"Mike",year:1997,color:"blue"}); cars.push({make:"Kelly",year:1986,color:"red"}); for(var i:int = 0; i < cars.length; i++) { ????trace(cars[i].make + " - " + cars[i].year + " - " + cars[i].color); } //输出: //???? Mike - 1997 - blue //???? Kelly - 1986 - red 【在数组中获取最小或最大值】 var scores:Array = [10,4,15,8]; scores.sort(Array.NUMERIC); trace("Minimum: " + scores[0]); trace("Maximum: " + scores[scores.length - 1]); 【使用for ... in语句读取关联数组元素】 var myObject:Object = new Object(); myObject.name = "YoungBoy"; myObject.age = 20; for(var i:String in myObject) { ????trace(i + ": " + myObject[i]); } //输出: name: YoungBoy //??????age: 20 注意: for ... in循环不会显示对象所有的内建属性.例如,循环会显示执行期间新增的特殊属性,但是,不会列出内建对象的方法,即使都是储存在对象属性内. 【AVM(ActionScript Virtual Machine,虚拟机)和渲染引擎(Rendering Engine)】 AVM负责执行ActionScript程序,而渲染引擎则是把对象绘制在显示器上. 【指出容器的显示清单中有多少显示对象】 每个容器都有numChildren属性. 【把项目新增至显示清单】 addChild(child:DisplayObject) addChildAt(child:DisplayObject,index:int) index: 添加该子项的索引位置.如果指定当前占用的索引位置,则该位置以及所有更高位置上的子对象会在子级列表中上移一个位置. 【从显示清单中移除项目】 removeChild(child:DisplayObject) removeChildAt(index:int) index: 要删除的 DisplayObject 的子索引,该子项之上的任何显示对象的索引位置都减去1. 如果想移除窗口所有子元件,可以结合removeChildAt(),numChildren属性以及for循环.因为每次一个子元件被移除时,索引位置都会变化,所以,有两种方法可以处理所有子元件的移除: 1. 总是移除位置0的子元件; 2. 倒过来移除子元件,也就是从尾端开始. 【更改现有子项在显示对象容器中的位置】 setChildIndex(child:DisplayObject,index:int):void 可能用到的方法: 返回 DisplayObject 的 child 实例的索引位置: getChildIndex(child:DisplayObject):int 返回位于指定索引处的子显示对象实例: getChildAt(index:int):DisplayObject 注意: 当子元件移到低于它现在所在位置的索引时,那么,从标的索引起,直到子元件索引前面的那个索引的所有子元件都会令其索引增加1,而该子元件就会指定至标的索引.当子元件移到较高索引时,从该子元件索引之上的那个索引起,直到标的索引的所有子元件都会令其索引往下减1,而该子元件就会指定至标的索引值. 【关于TextField以垂直方式把文字摆在按钮表面中心点的小技巧】 textField.y = (_height - textField.textHeight) / 2; textField.y -= 2; //减2个像素以调整偏移量 【外部.swf影片载入和互动】 1. 监听init事件; 2. 透过content属性存取所载入的影片. 当所载入的影片做好足够的初始化工作,使其方法和属性可以接受互动时,init事件就会被发起.只有在载入器发起init事件后,才能控制影片.所载入的影片还没初始化就试着与它互动,是会产生执行期间错误的. _loader.contentLoaderInfo.addEventListener(Event.INIT,handleInit); //当载入的.swf的属性和方法可用时 _loader.load(new URLRequest("ExternalMovie.swf")); private function handleInit(event:Event):void { ????var movie:* = _loader.content; ????trace(movie.getColor()); ????movie.setColor(0xFF0000); } 【TextField有两种类型:动态(dynamic)和输入(input),默认值为动态.改变TextField类型方法】 field.type = TextFieldType.INPUT; //selectable属性默认值为true flash.text.TextFieldType.INPUT和flash.text.TextFieldType.DYNAMIC 【过滤文字输入】 TextField.restrict = "此处为可输入的内容"; field.restrict = "^此处为禁止输入的内容"; restrict属性支持一些类似正则表达式的样式: field.restrict = "a-zA-z"; //只允许大小字母 field.restrict = "a-zA-z "; //只允许字母和空格 field.restrict = "0-9"; //只允许数字 field.restrict = "^abcdefg"; //除了小写字母abcdefg不允许外,其它都允许 field.restrict = "^a-z"; //所有小写字母都不允许,其它内容都允许,包括大写字母 field.restrict = "0-9^5"; //只允许数字,但5例外 让restrict字符包含具有特殊意义的字母(例如-和^): field.restrict = "0-9-"; //允许数字和破折号 field.restrict = "0-9^"; //允许数字和^ field.restrict = "0-9\"; //允许数字和反斜杠 你也可以使用Unicode转义序列,指定允许的内容.例如: field.restrict = "^u001A"; 注意:ActionScript有区分大小写的,如果restrict属性设为abc,允许字母的大写形式(A,B和C)输入时会变成小写对待形式(a,b和c),反之亦然.restrict属性只影响用户可以输入的内容,脚本可将任何文本放入文本字段中. 【设定输入框的最大长度】 TextField.maxChars:int 【向TextField追加内容】 TextField.appendText(text:String):void 与通过对 text 属性使用加法赋值来连接两个字符串(例如 field.text += moreText)相比,此方法的效率更高. 【显示HTML格式的文字】 TextField.htmlText = "<b>Html text</b>"; 支持的HTML标签集有: <b>,<i>,<u>,<font>(有face,size以及color属性),< p>,<br>,<a>,<li>,<img>以及<textformat>(有 leftmargin,rightmargin,blockindent,indent,leading以及tabstops属性,相应于 TextFormat类的同名属性) 【缩减空白】 TextField.condenseWhite = true; 删除具有HTML文本的文本字段中的额外空白(空格,换行符等),如同多数HTML浏览器所做的那样. 注意: 在设置 htmlText 属性之前设置 condenseWhite 属性 【自动大小调整和对齐】 TextField.autoSize = TextFieldAutoSize.LEFT; 可选之值: flash.text.TextFieldAutoSize.CENTER flash.text.TextFieldAutoSize.LEFT flash.text.TextFieldAutoSize.NONE flash.text.TextFieldAutoSize.RIGHT 【指示文本字段是否自动换行】 TextField.wordWrap = true; //自动换行 【用程序手段滚动文字】 水平方向以像素为单位,而垂直方向以行做单位: scrollV: 指出文字框可见区域的最顶行,可读写; bottomScrollV: 指出文字框内最底端可见行,只读; maxScrollV: scrollV的最大值,只读; numLines: 定义多行文本字段中的文本行数,只读; TextField.scrollV = field.maxScrollV; //滚动到最后一页 【响应滚动事件】 field.addEventListener(Event.SCROLL,onTextScroll); 【样式化文字的方法】 1. 使用HTML标签进行样式化; 2. 使用TextFormat对象; 3. 使用CSS. 例如: HTML是用<font>标签,TextFormat对象是设定font属性,而CSS是使用font-family属性的. 受支持的层叠样式表(CSS)属性和值,及其相应的ActionScript属性名称(小括号内): color(color),display(display),font-family(fontFamily),font-size(fontSize),font-style(fontStyle),font-weight(fontWeight),kerning(kerning),leading(leading),letter-spacing(letterSpacing),margin-left(marginLeft),margin-right(marginRight),text-align(textAlign),text-decoration(textDecoration),text-indent(textIndent) 受支持的HTML实体: <(小于号: <),>(大于号: >),&(和: &),"(双引号: "),'(撇号,单引号: ') 其中样式对象的两种写法: 写法一: var sampleStyle:Object = new Object(); sampleStyle.color = "#FFFFFF"; sampleStyle.textAlign = "center"; css.setStyle(".sample",sampleStyle); 写法二: var sampleStyle:Object = {color: "#FFFFFF",textAlign: "center"}; css.setStyle(".sample",sampleStyle); 【对用户输入的文字进行样式化】 使用defaultTextFormat属性,样式会施加至用户键入输入框的文字身上: var formatter:TextFormat = new TextFormat(); formatter.color = 0x0000FF; //把文字变成蓝色 field.defaultTextFormat = formatter; 【对现有文字的一部分进行样式化】 TextFormat.setTextFormat(format:TextFormat,beginIndex:int = -1,endIndex:int = -1):void 【设定文字框的字体】 例子: HTML: field.htmlText = "<font face='Arial'>Formatted text</font>"; TextFormat: formatter.font = "Arial"; CSS: P{ font-family: Arial; } 也可以使用以逗号隔开的字体清单: formatter.font = "Arial,Verdana,Helvetica"; 注意: 字体和字体群组不同.字体群组有三种: _sans,_serif以及_typewriter. _sans群组一般就是指Arial或Helvetica这种字体; _serif群组一般就是指Times或Times New Roman这种字体; _typewriter群组一般就是指Courier或Courier New这种字体. 【嵌入字体】 使用[Embed]后设标签.[Embed]后设标签应该出现在ActionScript文件中,处于类宣告之外.你可以内嵌TrueType字体或系统字体.内嵌TrueType字体时的语法: [Embed(source="pathToTtfFile",fontName="FontName",mimeType="application/x-font-truetype")] pathToTtfFile: ttf文件的路径,TrueType字体的路径可以是相对的,也可以是绝对的; FontName: 字体名称; 内嵌系统字体的语法: [Embed(systemFont="Times New Roman",fontName="Times New Roman",mimeType="application/x-font-truetype")] fontName: 以相同名称作为实际系统字体名称. 注意: 在使用嵌入字体时,要把TextField的embedFonts属性设为true,这样TextField只能用内嵌字体了.如果你试着替 embedFonts设为true的TextField使用设备字体,什么都不会显示.如果embedFonts设为true,就无法指定以逗号相隔的字体清单. 【建立可以旋转的文字】 使用内嵌字体.当你旋转文字框时,设备字体就会消失. 【显示Unicode文字】 1. 从外部来源载入Unicode文字; 2. 假如你的编辑器支持Unicode(如 Flex Builder),则可以直接在ActionScript程序中使用该字符; 3. 使用Unicode转义字符,ActionScript里所有Unicode转义字符都以u开头,后面再跟四位十六进制数字. 注意: 如果你想取得Unicode字符,在Windows下使用: 开始>所有程序>附件>系统工具>字符映射表. 【把Flash Player的焦点带给文字框】 stage.focus = field; 把焦点移除: stage.focus = null; 注意: 当.swf文件首次载入至网页浏览器时,并没有焦点.因此,以程序的方式把焦点指定给Flash应用程序的一个元素前,必须先把焦点移至Flash Player. 【以ActionScript选取文字】 使用TextField.setSelection(beginIndex:int,endIndex:int):void 为了可以正常选取文字,文字框必须具有焦点: stage.focus = field; //把焦点设给文字框 field.text = "This is example text"; //设定文字 field.setSelection(0,4); //把"This"这个单词以高亮显示 使用只读的selectionBeginIndex和selectionEndIndex属性访问所选取的字符范围的索引. 【在文字内设定安插点(游标位置)并访问游标位置的索引值】 可以使用TextField.setSelection()把起始和结尾的索引参数都设成相同值,在文字内设定游标位置(假设具有焦点): field.setSelection(0,0); //在第一个字符前摆放安插点 trace(field.caretIndex); //输出游标位置的索引值 【当文本字段受到选取或取消选取时给予响应】 获得焦点时: FocusEvent.FOCUS_IN 失去焦点时: FocusEvent.FOCUS_OUT 通过键盘(Tab键)把焦点移除时: FocusEvent.KEY_FOCUS_CHANGE 通过鼠标把焦点移除时: FocusEvent.MOUSE_FOCUS_CHANGE FocusEvent 类有一个relatedObject属性.就FOCUS_IN事件而言,relatedObject属性是刚才拥有焦点的对象的引用地址;对于FOCUS_OUT,KEY_FOCUS_CHANGE以及MOUSE_FOCUS_CHANGE事件,relatedObject属性是刚接收到焦点的对象的引用地址. FOCUS_IN和FOCUS_OUT事件都是在焦点改变后发生的,所以两者都是不可取消的事件.对于KEY_FOCUS_CHANGE和MOUSE_FOCUS_CHANGE事件,可以使用FocusEvent.preventDefault()方法取消默认行为: field.addEventListener(FocusEvent.KEY_FOCUS_CHANGE,onKeyFocus); private function onKeyFocus(event:FocusEvent):void { ????if(field.text == "") { ????????event.preventDefault(); //当field没有任何文字前,不允许使用Tab键把焦点移除 ????} ????//event.relatedObject就是刚才拥有焦点的对象的引用地址,即下一个获得焦点的对象的引用地址 } 【响应用户的输入行为】 field.addEventListener(TextEvent.TEXT_INPUT,onTextInput); private function onTextInput(event:TextEvent):void { ????if(event.text == "a" && field.length == 0) { ????????event.preventDefault(); //TEXT_INPUT是可以取消的事件.TextEvent有一个text属性,内含用户所输入的的字符.此例子确保用户输入的第一个字母不是"a" ????} } 【把超链接加入文字】 打开网页: 例子1: var css:StyleSheet = new StyleSheet(); css.parseCSS("a{color:#0000FF;} a:hover{text-decoration:underline;}"); field.styleSheet = css; field.htmlText = "<a href=' http://www.riahome.cn/' target='_blank'>Link text</a>"; 例子2: field.text = "Link text"; var formatter:TextFormat = new TextFormat(); formatter.url = " http://www.riahome.cn/"; formatter.target = "_blank"; field.setTextFormat(formatter); 打开Email: field.text = "Link text"; var formatter:TextFormat = new TextFormat(); formatter.url = "mailto:y_boy@126.com"; field.setTextFormat(formatter); 使用event协议,打开ActionScript方法: field.htmlText = "<a href='event: http://www.riahome.cn/'>www.RIAHome.cn</a>"; field.addEventListener(TextEvent.LINK,onClickHyperlink); private function onClickHyperlink(event:TextEvent):void { ????trace(event.text); //输出: http://www.riahome.cn/ } 【精确获取某字符的索引值】 在 x 和 y 参数指定的位置返回从零开始的字符索引值 TextField.getCharIndexAtPoint(x:Number,y:Number):int 例子: field.getCharIndexAtPoint(mouseX,mouseY); //返回鼠标位置上的该字符的索引值 【精确获取某字符的边框区域】 TextField.getCharBoundaries(charIndex:int):Rectangle 通过读取Rectangle的x,y,width以及height等属性来确定该字符的边框区域范围. 【精确获取某行的索引值】 在 x 和 y 参数指定的位置返回从零开始的行索引值 TextField.getLineIndexAtPoint(x:Number,y:Number):int field.getLineIndexAtPoint(mouseX,mouseY); //返回鼠标位置上的该行的索引值 【获取指定索引值处的字符所在行的行索引值】 TextField.getLineIndexOfChar(charIndex:int):int 【获取指定行的字符数】 TextField.getLineLength(lineIndex:int):int 【获取指定索引值处的行所包含的字符】 TextField.getLineText(lineIndex:int):String 【获取指定行索引所在行的第一个字符的索引值】 TextField.getLineOffset(lineIndex:int):int 【获取指定文本行的度量信息】 TextField.getLineMetrics(lineIndex:int):TextLineMetrics TextLineMetrics类包含文本字段中某行文本的文本位置和度量值的相关信息,帮助文档里有深入的图解. 【获取指定索引处的字符所在段落内的第一个字符索引值】 如果给定一个字符索引,则返回同一段落中第一个字符的索引 TextField.getFirstCharInParagraph(charIndex:int):int 【获取指定索引处的字符所在段落内的字符数】 TextField.getParagraphLength(charIndex:int):int 【替换所选文字】 TextField.replaceSelectedText(value:String):void 可以使用此方法插入和删除文本而不破坏其余文本的字符和段落格式. 【替换指定范围的文本】 TextField.replaceText(beginIndex:int,endIndex:int,newText:String):void 注意: 如果对文本字段应用了样式表,则该方法不起作用 【Timer计时器的使用】 var timer:Timer = new Timer(delay:Number,repeatCount:int = 0); timer.addEventListener(TimerEvent.TIMER,onTimer); timer.start(); private function onTimer(event:TimerEvent):void { ????//code } 【以指定方向和速度移动元件】 speed: 目标速度 radians: speed与x轴的夹角,弧度 vx = Math.cos(radians) * speed; vy = Math.sin(radians) * speed; 【缓动动画算法】 targetX,targetY: 目标坐标; easingSpeed: 每次移动分数,范围0到1; var vx:Number = (targetX - sprite.x) * easingSpeed; var vy:Number = (targetY - sprite.y) * easingSpeed; sprite.x += vx; sprite.y += vy; 注意: 在非常逼近目标点时,往往找出通往目标点的距离,如果其值少于特定值,就应该停止该缓动. 【模拟弹簧往复运动算法】 五个变量: targetX(目标点的x坐标),sprite.X(物体的x坐标),vx(水平速度),ax(水平加速度),k(弹簧强度) 已知: targetX(目标点的x坐标),k(弹簧强度) var ax:Number = (targetX - sprite.x) * k; vx += ax; sprite.x += vx; 注意: 这里只是水平方向的情形,也可以推广到垂直方向以及水平垂直一起来的情形 【模拟单摆运动】 四个变量: sprite.x(物体的x坐标),centerX(中心位置的x坐标),angle(弧度),radius(摆动的振幅,也就是摆动的范围) sprite.x = centerX + Math.sin(angle) * radius; angle += 0.05; 【模拟阻尼运动】 六个变量: targetX(目标点的x坐标),k(弹簧强度),damp(阻尼系数) 已知: targetX(目标点的x坐标),k(弹簧强度) var ax:Number = (targetX - sprite.x) * k; vx += ax; sprite.x += vx; vx *= damp; //无阻力情况下的弹簧往复运动只缺少此句 注意: 这里只是水平方向的情形,也可以推广到垂直方向以及水平垂直一起来的情形. 这种原理可以推广到其它属性,如scaleX: scaleVel += (targetScale - sprite.scaleX) * k; sprite.scaleX += scaleVel; scaleVel *= damp; 【计算两点间的角度】 Math.atan2(y:Number,x:Number):Number y: 两点间的垂直距离 x: 两点间的水平距离 返回一个以弧度为单位的角度,返回值介于正PI和负PI之间. 【让物体指着鼠标(跟随眼睛)】 var dx:Number = mouseX - sprite.x; var dy:Number = mouseY - sprite.y; var radians:Number = Math.atan2(dy,dx); sprite.rotation = radians * 180 / Math.PI; 【联结字符串时需要注意的地方】 var result:String = 2 + 6 + "a"; trace(result); //输出: 8a var result:String = "a" + 2 + 6; trace(result); //输出: a26 var result:String = "a" + (2 + 6); trace(result); //输出: a8 【查找匹配的字符串】 使用String.indexOf(val:String,startIndex:Number = 0):int 返回指定子字符串的第一个匹配项的索引,没有匹配就返回-1 查找所有匹配的字符串: var index:int = -1; while((index = myString.indexOf("val",index + 1)) != -1) { ????trace("结果:" + index); } 使用String.lastIndexOf(val:String,startIndex:Number = 0x7FFFFFFF):int 返回指定子字符串的最后一个匹配项的位置,没有匹配就返回-1 var index:int = myString.length; while((index = myString.lastIndexOf("val",index - 1)) != -1) { ????trace("结果:" + index); } 注意: indexOf()和lastIndexOf()方法都是区分大小写的.想把大小写都查找出来的话,可以结合String.toLowerCase()和String.toUpperCase()方法先把字符串一起转为小写或大写再进行查找. 【提取子字符串】 String.substr(startIndex:Number = 0,len:Number = 0x7fffffff):String String.substring(startIndex:Number = 0,endIndex:Number = 0x7fffffff):String String.slice(startIndex:Number = 0,endIndex:Number = 0x7fffffff):String substr()第一个参数可以是负值,表示索引值是从字符串尾端算过来,-1是最后一个字符; substring()和slice()差别在于substring()只接受正索引值,而把负值作为0处理.另外,如果endIndex小于startIndex,substring()方法在执行前,会自动将其调换过来,总是使用两个参数中较小的值作为起始索引. slice()方法可接受startIndex和endIndex为负值,而把负值表示为从字符串的尾端算回来,slice()方法会返回空字符串. 【以指定模式拆分字符串】 String.split(delimiter:*,limit:Number = 0x7fffffff):Array 【替换指定的字符串】 使用String.replace(pattern:*,repl:Object):String 可以这样来替换所有指定的字符串: myString.split("a").join("b"); 【按单词或单个字母逆转字符串】 1. 把字符串切割使用String.split()方法成一个数组:对单词而言,以空格作为分界符,对字母而言,以空字符("")作为分界符; 2. 使用Array.reverse()方法对数组进行逆转; 3. 使用Array.join()方法重新组合为字符串:对单词而言,以空格(" ")作为联结符,以空字符("")作为联结符; 【使用SharedObject及捕获异常】 var so:SharedObject = SharedObject.getLocal("so"); so.data.userName = "Youthoy"; try { ????var flushResult:String = so.flush(500 * 1024); //请求500KB容量 ????//如果flush()没成功执行,就替netStatus加个事件处理函数以确认用户是同意还是拒绝,否则只检验结果. ????if(flushResult == SharedObjectFlushStatus.PENDING) { ????????//替netStatus加个事件处理函数,使得我们可以检验用户是否同意以足够磁盘容量储存共享对象.当netStatus事件发生时,执行onStatus函数. ????????so.addEventListener(NetStatusEvent.NET_STATUS,onStatus); ????}else if(flushResult == SharedObjectFlushStatus.FLUSHED) { ????????//成功储存.把数据成功储存后你想执行的程序放在这里. ????} }catch(e:Error) { ????//这里表示用户把本地储存设置为"拒绝".如果储存数据很重要,你会想在此警告用户. ????//此外,如果你想让用户可修改其设定值,可以用下面语句打开Player的"设置"对话框的本地储存页面. ????Security.showSettings(SecurityPanel.LOCAL_STORAGE); } //定义onStatus函数以处理共享对象的状态事件.flush()返回"pending"时,引发提示,而用户做了选择后所引发的事件. function onStatus(event:NetStatusEvent):void { ????if(event.info.code == "SharedObject.Flush.Success"){ ????????//如果event.info.code内容是"SharedObject.Flush.Success",表示用户同意.把用户同意后你想执行的程序放在这里. ????}else if(event.info.code == "SharedObject.Flush.Failed"){ ????????//如果event.info.code内容是"SharedObject.Flush.Failed",表示用户同意.把用户拒绝后你想执行的程序放在这里. ????} ????//现在,移除事件监听器,因为我们只需监听一次. ????so.removeEventListener(NetStatusEvent.NET_STATUS,onStatus); } 【向LSO储存对象时需要注意】 LSO 使用二进制的AMF(Action Message Format)对一个对象进行编码.当你在LSO储存类对象时,该对象会编码成包含内容属性的普通对象.于是,当你试着从共享对象里读取该对象时,无法被读成某类的对象,因为没有类型数据.要克服这个限制,使用flash.net.registerClassAlias()方法. 任何影片中,只要从共享对象读取出自定义对象数据,自定义类就必须注册别名,而且调用registerClassAlias()方法时必须在SharedObject.getLocal()方法被调用之前. 【要相同域名内的两个影片可以存取相同LSO】 首先LSO是储存在以下目录下: C:Documents and Settings[user name]Application DataMacromediaFlash Player#SharedObjects 例如,如果来自于 http://www.riahome.cn/youthoy的影片movie.swf写入名为example的LSO,则数据会储存在以下位置: C:Documents and Settings[user name]Application DataMacromediaFlash Player#SharedObjects[random directory name]riahome.cnyouthoymovie.swfexample.sol 如果在这个movie.swf里的代码是这样的: var example:SharedObject = SharedObject.getLocal("example","/"); 也就是使用了选用的本地路径参数,则LSO会储存在以下路径,注意到与以上路径少了"youthoymovie.swf": C:Documents and Settings[user name]Application DataMacromediaFlash Player#SharedObjects[random directory name]riahome.cnexample.sol 以此方法建立的LSO,可以由相同域的其它Flash影片用以下程序来读取: var example:SharedObject = SharedObject.getLocal("example","/"); 再看一个例子: 有两个Flash影片movieOne.swf和movieTwo.swf都位于同一域( http://www.riahome.cn/)内,movieOne.swf位于 http://www.riahome.cn/youthoy/firstGroup,而movieTwo.swf位于 http://www.riahome.cn/youthoy/secondGroup.在这情况里,movieOne.swf可以用下列任何本地路径建立和读取LSO: / /youthoy /youthoy/firstGroup 而movieTwo.swf可以用下列任何本地路径建立和读取LSO: / /youthoy /youthoy/secondGroup 因此,如果你想要两个影片都可以读取相同LSO,当你调用getLocal()方法时,必须指定影片共享的两个本地路径之一(/或/youthoy). 【URLLoader.dataFormat的三种类型】 URLLoader.dataFormat的可选值是: flash.net.URLLoaderDataFormat.BINARY flash.net.URLLoaderDataFormat.TEXT flash.net.URLLoaderDataFormat.VARIABLES 当dataFormat是BINARY时,URLLoader.data属性就是flash.utils.ByteArray类型; 当dataFormat是TEXT时,URLLoader.data属性就是String类型; 当dataFormat是VARIABLES时,uRLLoader.data属性就是Object类型. 【在XML内使用动态数据】 把变量放在大括号({和})内: var userName:String = "Youthoy"; var myXML:XML = <person><userName>{userName}</userName></person>; 【新增一个节点元素】 //例子一: var example:XML = <person/>; example.father = <father/>; //内容属性和元素名称不一定要相同,也可以: example.abc = <father/>,但会以元素名称为准,即会建立一个<father/>元素 trace(example); /* 输出: <person> ??<father/> </person> */ //例子二: var example:XML = <person/>; example.father = ""; //建立一个<father/>元素 trace(example.toString()); /* 输出: <person> ??<father/> </person> */ //例子三: var example:XML = <person/>; var id:int = 10; example["user" + id] = ""; trace(example); /* 输出: <person> ??<user10/> </person> 注意: 有些情况必须使用第三种情况.例如,元素节点名称内含连字符("-")是完全合法的,但在ActionScript里会得到编译器错误: example.some-element = ""; //产生编译器错误 正确的写法是: example["some-element"] = ""; */ 【新增属性】 var example:XML = <person/>; example.element = ""; example.element.@name = "Youthoy"; example.element.@["bad-variable-name"] = "yes"; example.element.@other = ["riahome.cn",undefined,true,44,null]; var id:int = 44; example.element.@["user" + id] = "love"; trace(example); /* 输出: <person> ??<element name="Youthoy" bad-variable-name="yes" other="riahome.cn," user44="love"/> </person> */ 【向XML插入文字元素和节点元素】 //在指定元素前和后插入,在最前端和尾端插入 var example:XML = <person/>; example.two = ""; example.insertChildBefore(example.two,<one/>); //在two节点前插入one节点 example.insertChildBefore(example.two,"在two节点前插入文字"); example.insertChildAfter(example.two,<three/>); //在two节点后插入three节点 example.prependChild(<start/>); //在最顶端插入start节点 example.appendChild(<end/>); //在尾端插入end节点 example.start = "start内容"; //向节点增加内容 trace(example); /* 输出: <person> ??<start>start内容</start> ??<one/> ??在two节点前插入文字 ??<two/> ??<three/> ??<end/> </person> */ 【把XML实例的内容属性转换为任何可以转换成字符串的内容】 //先把等号右边转为可以转换的字符串 var example:XML = <person/>; example.one = "one"; example.two = new URLLoader(); example.three = new Sprite(); example.four = new Boolean; //Boolean对象的值初始化为false example.five = new Number(); example.six = new String(); example.seven = {a:"Youthoy",b:true,c:undefined}; example.eight = ["three",null]; /* 输出: <person> ??<one>one</one> ??<two>[object URLLoader]</two> ??<three>[object Sprite]</three> ??<four>false</four> ??<five>0</five> ??<six/> ??<seven>[object Object]</seven> ??<eight>three,</eight> </person> */ 【对XML属性层层递归的算法】 var example:XML = <menu> ????????????????????<menuitem label="File"> ??????????????????????<menuitem label="New"/> ??????????????????????<menuitem label="Save"/> ????????????????????</menuitem> ????????????????????<menuitem label="Help"> ??????????????????????<menuitem label="About"/> ????????????????????</menuitem> ??????????????????</menu>; walk(example); function walk(node:XML):void { for each(var element:XML in node.elements()) { ????trace(element.@label); ????walk(element); } 【读取文字节点及其值】 var example:XML = <menu> ????????????????????My name is Youthoy. ????????????????????<myName>Youthoy</myName> ??????????????????</menu>; example.text(); //输出: My name is Youthoy. example.myName.toXMLString(); //输出: <myName>Youthoy</myName> //以下三行都输出: Youthoy example.myName.toString(); example.myName.text(); example.myName; 【递归元素属性时读取属性名与其值】 var example:XML = <person name="Youthoy" age="21"/>; ????for each(var i:XML in example.attributes()) { ????trace(i.name() + "=" + i); } /* 输出: name=Youthoy age=21 */ 另类方法: var example:XML = <person name="Youthoy" age="21"/>; trace(example.@*[1]); //输出: 21 【不论层级地访问整个XML中指定的节点或属性】 使用后代存取器运算符.. 例子1(对于节点元素): var example:XML = <a> ????????????????????<z>I am z.</z> ????????????????????<b> ???????????????????? <c></c> ???????????????????? <z>I am z.</z> ?????????????????? </b> ???????????????? </a>; trace(example..z.text()); //输出: I am z.I am z. 例子2(对于属性): var example:XML = <person> ????????????????????<a> ??????????????????????<item name="Youthoy" age="21"/> ????????????????????</a> ????????????????????<item name="Jimpa" age="21"/> ??????????????????</person> trace(example..@name); //输出: YouthoyJimpa 【删除节点元素,文字节点以及属性】 使用delete对单一项进行删除,要删除整个XMLList可以使用for循环以倒序形式进行删除,以避免迭代时需要改变数组索引问题. 【搜索XML的高级应用】 使用术语过滤.(condition),可结合正则表达式来使用. 例子: var example:XML = <foodgroup> <fruits> ??<fruit color="red">Apple</fruit> ????<fruit color="orange">Orange</fruit> ????<fruit color="green">Pear</fruit> ????<fruit color="red">Watermelon</fruit> ??</fruits> ??<vegetables> ????<vegetable color="red">Tomato</vegetable> ????<vegetable color="brown">Potato</vegetable> ????<vegetable color="green">Broccoli</vegetable> ??</vegetables> </foodgroup>; trace(example..*.(hasOwnProperty("@color") && @color == "red")); /* hasOwnProperty所做的检测是确保元素具有color属性,然后,有的话,就测试color属性之值是否为red.只有当条件的计算结果为true时,该元素才会加入EX4运算式所返回的XMLList. 输出 <fruit color="red">Apple</fruit> <fruit color="red">Watermelon</fruit> <vegetable color="red">Tomato</vegetable> */ 【CDATA(Character Data)标签】 <![CDATA[]]>,必须大写.如果<![CDATA[[]]]>这样的话,它会告诉你语法错误的. 【一些名词】 RPC: 全称: Remote Procedure Call,台湾的朋友称其为: 远端程序呼叫 SOAP: 全称: Simple Object Access Protocol,台湾的朋友称其为: 简单物体存取协定 WSDL: 全称: Web Service Description Language,台湾的朋友称其为: web service描述语言 ? ? 事实上,没有什么要比发现、培养、呵护、调整自己的心智的力量更重要的事情了......... ?
分类:
AS3
绿色通道:
好文要顶
关注我
收藏该文
与我联系
0
0
(请您对文章做出评价)
?博主前一篇:
Asp.net 备份、还原Ms SQLServer及压缩Access数据库
?博主后一篇: [AS3] 解决跨域问题
posted @ 2008-08-20 14:59
appleseed 阅读(1022)
评论(5)
编辑
收藏
发表评论
回复
引用
查看 ??
#1楼
[
楼主]
2009-01-02 19:43
appleseed?
?????
as中心旋转:转cenFun Blog
import flash.geom.Matrix; import flash.geom.Transform; function rotation(mc:MovieClip,d:Number) { var x:Number = mc._x; var y:Number = mc._y; var w:Number = mc._width; var h:Number = mc._height; var myMatrix:Matrix = new Matrix(); var radians:Number = (d/180)*Math.PI; myMatrix.rotate(radians); var translateMatrix:Matrix = new Matrix(); translateMatrix.translate(x+w/2-w/2*Math.cos(radians)+h/2*Math.sin(radians),y+h/2-w/2*Math.sin(radians)-h/2*Math.cos(radians)); myMatrix.concat(translateMatrix); var rectangleTrans:Transform = new Transform(mc); rectangleTrans.matrix = myMatrix; } //调用,将obj旋转-90度:rotation(obj,-90);
回复
引用
查看 ??
#2楼
[
楼主]
2009-01-02 19:44
appleseed?
?????
String.fromCharCode()转的是Unicode码,如果要转ansi码,结果会是乱码,应该用以下方法转:
var str:Array=[0xB9FE,0xB9FE,0xA3A1,0x21]; var len:uint=str.length; var ba:ByteArray=new ByteArray(); for (var i:uint=0; i<len; i++) { if(str[i]>0xFF) ba.writeShort(str[i]); else ba.writeByte(str[i]); } ba.position=0; var result:String=ba.readMultiByte(ba.length,"gb2312"); trace(result);//结果为: 哈哈!!
回复
引用
查看 ??
#3楼
[
楼主]
2009-01-02 19:45
appleseed?
?????
1. 客户端生成BitmapData 对象。
2. 用JPGEncoder 对其编码相应的字节数组 3 用URLRequest和URLLoader发送数据。 4.服务用request.getInputStream()接收流.. 5.保存为图片格式。 package ...{ import flash.geom.Point; import flash.geom.Rectangle; import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.* ; import flash.display.*; import flash.geom.* ; import flash.net.*; import flash.utils.ByteArray; import com.wdxc.util.* ; public class Main extends Sprite ...{ private var _picx:int = 0 ; private var _picy:int = 120 ; private var _picwidth = 0 ; private var _picheight = 0 ; private var _bitmapdata:BitmapData ; private var _rect:Sprite ;//裁剪区域 private var _url:String ="http://192.168.0.211/test.jsp"; public function Main():void...{ this.loadPic("F:a.jpg"); this.init(); } public function init():void ...{ cut_btn.addEventListener(MouseEvent.MOUSE_DOWN,grabPic); save_btn.addEventListener(MouseEvent.MOUSE_DOWN,savePic) ; } /** *//**** * 装载图片 * @param picurl */ public function loadPic(picurl:String):void...{ if (picurl == null || picurl == "") ...{ return ; } var request:URLRequest = new URLRequest(picurl); var loader:Loader = new Loader() ; loader.load(request); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHander); } /** *//** * 对图片编码并提交给服务端保存。 * @param bitmapdata 图片数据 */ public function submit(bitmapdata:BitmapData):void ...{ //每次URL不同,AS3才会提交每一次,否则将不提交。 var url :String = _url+"?"+Math.floor(Math.random()*1000) ; var request:URLRequest = new URLRequest(url); //编码成图片格式流 var encoder:JPGEncoder = new JPGEncoder(80); var bytes:ByteArray = encoder.encode(bitmapdata); request.method = URLRequestMethod.POST; request.data = bytes ; //设置成文件流形式 request.contentType = "application/octet-stream"; var loader:URLLoader = new URLLoader(); loader.load(request) ; loader.addEventListener(Event.COMPLETE,sendCompleteHandler) ; } /** *//** * 服务端保存完回调 * @param e */ private function sendCompleteHandler(e:Event):void ...{ trace("save success........"); } /** *//** * 保存裁剪图片 * @param e */ private function savePic(e:MouseEvent)...{ //组装要裁剪区域 var cutpic:Rectangle = new Rectangle(_rect.x,_rect.y,_rect.width,_rect.height); var bitmapdata:BitmapData = this.getCutData(_bitmapdata,cutpic); var bitmap:Bitmap = new Bitmap(bitmapdata) ; bitmap.x = 100 ; bitmap.y = 0 ; //只显示裁剪区域图片,去除其他空位置 this.addChild(bitmap); this.submit(cutbitmapdata); } /** *//** * 获取所裁剪区域的数据。所有像素信息 * @param source 源图数据 * @param rect 所有裁剪的区域 * @return BitmapData 裁剪出新图的数据 */ public function getCutData(source:BitmapData,rect:Rectangle):BitmapData ...{ //存放裁剪出的新图片 var cutbitmapdata:BitmapData = new BitmapData(Math.floor(_rect.width),Math.ceil(_rect.height)) ; //坐标转化,把坐标移到裁剪区域的位置,宽度和高度在cutbitmapdata里指定。 var matrix:Matrix = new Matrix(1,1,-Math.floor(_rect.x),-Math.floor(_rect.y)); cutbitmapdata.draw(_bitmapdata,matrix); return cutbitmapdata ; } /** *//**** * 装载图片完成之后,显示图片到场景 * @param e */ private function completeHander(e:Event):void ...{ var loader:Loader = e.target.loader as Loader; this._picwidth = loader.width ; this._picheight = loader.height ; _bitmapdata= new BitmapData(loader.width,loader.height); _bitmapdata.draw(loader); var _bitmap:Bitmap = new Bitmap(_bitmapdata); _bitmap.x = this._picx; _bitmap.y = this._picy ; this.addChild(_bitmap); } /** *//**** * 生成裁剪区域框,用来抓起图片 * @param e */ private function grabPic(e:MouseEvent):void ...{ _rect= new Sprite () ; /** *//***设置裁剪区域边框样式*/ _rect.graphics.lineStyle(3,0xFF0000,0.5,LineScaleMode.NONE,CapsStyle.ROUND); _rect.graphics.beginFill(0xCCFF00,0); _rect.graphics.drawRect(this._picx,this._picy,this._picwidth/4,this._picheight/4); _rect.graphics.endFill(); _rect.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler) ; _rect.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandle) ; this.addChild(_rect) ; } /** *//** * 鼠标控制裁剪区域,可拖动,拉伸。 * @param e */ private function mouseDownHandler(e:MouseEvent):void ...{ //裁剪区域移动范围,不能超过原图区域。 var _rectangle:Rectangle = new Rectangle(); _rectangle.width = _picwidth-_rect.width ; _rectangle.height = _picheight-_rect.height ; _rect.startDrag(false,_rectangle); } private function mouseUpHandle(e:MouseEvent):void ...{ _rect.stopDrag(); } } } 服务端处理代码 <% String filePath = request.getRealPath(System.currentTimeMillis()+".jpg"); System.out.print("filepath=="+filePath); BufferedInputStream inputStream = new BufferedInputStream(request.getInputStream()); FileOutputStream utputStream = new FileOutputStream(new File(filePath)); byte [] bytes = new byte[1024]; int v; while((v=inputStream.read(bytes))>0){ outputStream.write(bytes,v); } outputStream.close(); inputStream.close(); %>
回复
引用
查看 ??
#4楼
[
楼主]
2009-02-13 11:37
appleseed?
?????
var someListener:Object;
mcHandel(); function mcHandel() { someListener = new Object(); someListener.onMouseMove = function() { MouseHandel(); trace("onMouseMove"); }; Mouse.addListener(someListener); } aaa_mc.onRelease = function() { MouseShowHandel(); }; function MouseShowHandel() { Mouse_mc._visible = false; Mouse.removeListener(someListener); Mouse.show(); }
回复
引用
查看 ??
#5楼
[
楼主]
2010-11-17 12:15
appleseed?
?????
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |