1、Flash与Flex3结合学习心得体会 Flash与Flex3结合学习心得体会 1 Flash跨域调用问题 3 Loader与URLLoader的比较 3 AS3-点阵化文字 4 Javascript与Flash互动 4 Flash中组件(Component)的创建和使用 5 AS2 - 创建MovieClip的子类 6 AS-可正可负随机数的算法 8 AS3鼠标坐标总结 8 AS3练习-往返运动 8 as3运行时错误中文说明 9 AIR-最新RSSReader(基于Flash) 9 Flash-navigateToURL取代getURL 10 Flash-如何改变
2、动态文本透明度? 11 AS3中鼠标事件小结 12 typeof、is、as的区别 13 Null、NaN和undefined的区别 13 SwfObject解决Html与Flash之间传递参数问题 14 彻底摒弃Adobe的激活ActiveX控件的方法 15 今天折腾了大半天Flash与Flex3的配合,特总结一下心得体会: 1) 如果是通过Embed来嵌入swf的话,Flex3只支持FlashCS2所创建的swf. 2) 如果是通过loader来加载的话,只有AS3的swf才能在加载后被控制(这和第一点相反,我花了很长时间才弄明发现这两点,汗!) 3) 如果要直接加载
3、到Flex当中,类必须继承UIComponent,这好比在Flash中必须继承DisplayObject 4) 如果要把Flash的组建打包给Flex使用,应该使用FlexComponentKit,把MC导出成swc。然后在Flex中把swc配置到Library Path后,对应的组建就可以作为一等公明在Flex中使用了。如果MC是绑定了类的,那么对应类继承UIComponent就可以了。 在googleDocs下了一个corelib包,不是蛮实用的(前段时间还自己写trim,浪费时间啊),E文看得累,以备以后查看 //图相用法 import com.adobe.images.J
4、PGEncoder; public function submit():void { var encoder:JPGEncoder = new JPGEncoder(80); var bytes:ByteArray = encoder.encode(getBitmapData()); var request:URLRequest = new URLRequest(UPLOAD_PAGE); //data值就为图片编码数据ByteArray; request.data = bytes; request.method = URLRequestMethod.POST; //这个是关键
5、内容类型必须是下面文件流形式; request.contentType = “application/octet-stream”; var loader:URLLoader = new URLLoader(); loader.load(request); } //加密用法 import com.adobe.crypto.SHA1; trace(SHA1.hash(”132″)); //utils包比较繁锁,全都是静态方法 import com.adobe.utils.ArrayUtil; ArrayUtil.arrayContainsValue(arr, value);/
6、/arr是否包含value ArrayUtil.arraysAreEqual(arr1, arr2);//arr1,arr2是否相等 ArrayUtil.copyArray(a);//深拷贝 ArrayUtil.removeValueFromArray(arr, value);//删除值value import com.adobe.utils.StringUtil; StringUtil.beginsWith(str1, str2);//str1是否以str2开头 StringUtil.endsWith(str1, str2);//str1是否以str2结束 StringUtil
7、ltrim(str);//去左空格 StringUtil.rtrim(); StringUtil.trim(); StringUtil.remove(str1, str2);//从str1删除str2 StringUtil.replace(input, replace, replaceWith);//把input中的replace置换为replaceWith StringUtil.stringsAreEqual(s1, s2, caseSensitive);//s1,s2是否相等,caseSensitive是否大小写敏感 import com.adobe.utils.DateUt
8、il; DateUpareDates(d1, d2);//比较,d1>d2返回-1,=返回0,<返回1 DateUtil.getAMPM(d);//返回AM or PM ….功能比较全, 太多了, 还有几个不知道 import com.adobe.utils.NumberFormatter; NumberFormatter.addLeadingZero(5);//返回补0的数,如1变成01 import com.adobe.utils.IntUtil; IntUtil.toHex(n,bigEndian);//16进制,bigEndian指定是后补0,还是前补0 IntUtil
9、rol(n, m);//n右移m位(位运算) IntUtil.ror(n, m);//左移 import com.adobe.utils.DictionaryUtil; DictionaryUtil.getKeys(d);//得到键名 DictionaryUtil.getValues(d);//得到值 import com.adobe.utils.XMLUtil; 这个还不会用,以后慢慢摸,本来AS3的XML就很完善了 corelib包下载地址 Flash跨域调用问题 由于安全沙箱的限制, 处于不同域下的文件(swf, xml等)在默认状态下是不能相互调用的. 比如
10、A域名下的flash不能访问B域名下的XML. 除非B域名在根目录下的”crossdomain.xml”文档中包含A域名. 但存在以下问题: 1) 不允许改动根目录 解决方法: 在AS3允许crossdomain.xml不在根目录中,这时就要用Security.loadPolicyFile(” 当然只有crossdomain.xml所在目录是可以访问的. 2) 不允许添加crossdomain.xml 解决方法: 如果要被读取的是swf文件, 只要在主函数中加入flash.system.Security.allDomain(”A”)即可. 但如果是其他各式的文件, 比如xml文档的话怎
11、么办呢? 可以把xml读取到B上的b.swf(b上加入flash.system.Security.allDomain(”A”)). 然后在A的a.swf中加载b.swf,然后读取b.swf中的xml. 类似于: _mc =event.target.content as Sprite; trace(_mc["var"]); Loader与URLLoader的比较 AS3已经中Loader与URLLoader是两个比较容易混淆的类,特此区分: 应用范围 Loader: swf,图片(jpg,png,gif) URLLoader:文本文件(xml,php,jsp…) 使用
12、方法 Loader: loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); private function loadComplete(event:Event) { trace("done");addChild(loader);} URLLoader: xmlLoader.dataFormat=URLLoaderDataFormat.TEXT; xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded); private function x
13、mlLoaded(event:Event) { try {myXML = XML(event.target.data);area.text=myXML;} catch (e:TypeError) {area.text="Load faild:\n"+e.message;} } AS3-点阵化文字 上面是这两天做的一个小东西,它能够把输入的文字用点阵来描述,并存这些信息存入一个数组当中。然后用这个数组来重新生成“文字”,这些“文字”可以由任意的Sprite组成,并且可以随意加上动画。 承蒙大家厚爱,把源文件放在这里供大家下载。为了便于将来扩展,我使用的是Observer设计
14、模式,希望不会把大家搞混淆。 源文件下载 Javascript与Flash互动 在SwfObject解决Html与Flash之间传递参数问题中已经简要介绍了如何使用SwfObject在页面中插入Flash,如何在初始时由JS向Flash传递参数,以及运行时Flash如何调用JavaScript中函数。这里主要介绍运行时JavaScript如何互相传递参数, 并控制Flash的播放。 源文件下载 其实JS能直接控制Flash的播放,主要通过下列方法实现: Play() —————————————- 播放动画 StopPlay()————————————停止动画 IsPla
15、ying()———————————– 动画是否正在播放 GotoFrame(frame_number)—————- 跳转到某帧 TotalFrames()——————————- 获取动画总帧数 CurrentFrame()——————————回传当前动画所在帧数-1 Rewind()————————————-使动画返回第一帧 SetZoomRect(left,top,right,buttom)——-放大指定区域 Zoom(percent)——————————改变动画大小 Pan(x_position,y_position,unit)————使动画在x,y方向上平移 Percen
16、tLoaded()—————————-返回动画被载入的百分比 LoadMovie(level_number,path)———– 加载动画 TGotoFrame(movie_clip,frame_number)- movie_clip跳转到指定帧数 TGotoLabel(movie_clip,label_name)—— movie_clip跳转到指定标签 TCurrentFrame(movie_clip)————— 回传movie_clip当前帧-1 TCurrentLabel(movie_clip)—————–回传movie_clip当前标签 TPlay(movie_clip)——
17、———————播放movie_clip TStopPlay(movie_clip)———————-停止movie_clip的播放 GetVariable(variable_name)—————–获取变量 SetVariable(variable_name,value)———–变量赋值 TCallFrame(movie_clip,frame_number)—call指定帧上的action TCallLabel(movie_clip,label)—————-call指定标签上的action TGetProperty(movie_clip,property)——–获取movie_clip
18、的指定属性 TSetProperty(movie_clip,property,number)-设置movie_clip的指定属性 Read the rest of this entry » Flash中组件(Component)的创建和使用 这里简要介绍Flash中自定义组建的创建和使用方法.由于工作的原因,我用的是AS2, AS3的应该类似。 组建的创建 1 创建一个类文件,比如ClassLoader。这个文件实现组件的主要功能。它可以调用其它类,比如cn.adamstudio.effects.TextAnimation(这个类自己写,可以是简单的一个trace),这些类
19、将会自动打包到组件中。 //ClassLoader类: [IconFile("spidercore.png")]; class ClassLoader extends MovieClip { public function setSize() { _width=18; _height=18; } public function doNothing():Void { // Trick the compiler into including // the TextAnimation class in the component. cn.adamstudio.effect
20、s.TextAnimation; } } 2 创建一个Fla文件,如SWC_Generator。在其中新建一个MovieClip,如swc, 设置如下图: 3 在库中这个MC上右键,在右键菜单里选择”Component Definition…”.设置如下图: 4 此时在库面板中可以看出,MC已经转换成了一个元件.因为元件处在编辑状态.所以直接导入一个png图标到舞台上,如icon.png.这个图标是新建组建的图形标志,将来在库面板和舞台上将会看到它的身影. 5 在库中这个MC上右键,在右键菜单里选择”Export SWC File …”,保存SWC文件. 组建的使用 1
21、 将生成的SWC文件拷入: C:\Documents and Settings\User \Local Settings\ Application Data \Adobe \Flash CS3 \en \Configuration\Components\swc 2 新建一个Flash文件,如test.fla.在Flash中重新打开Component面板后,会发现swc目录下有我们拷入的SWC文件.将其拖入舞台后,在舞台上删除之.(只需要它在库中). 3 在第一帧上加入代码: import cn.adamstudio.effects.TextAnimation; var textAni
22、new TextAnimation; 即使本地电脑中没有cn.adamstudio.effects.TextAnimation,程序照样能运行,因为它这个类已经包含在了SWC文件当中. 注:SWC_Generator.fla和test.fla的输出设置都应该选择AS2,否则无法得到正确结果; 源文件下载:源文件 AS2 - 创建MovieClip的子类 在Flash中作视觉表现时,常常需要创建MovieClip的子类。下面是一个不错的框架: Avatar子类: class cn.adamstudio.Avatar extends MovieClip { //定义静态
23、变量,用于初始化 public static var HAPPY:Number = 0; public static var SAD:Number = 1; public static var IDLE:Number = 2; //定义静态方法,用于简洁地创建自己的instance public static function createAvatar(name:String, target:MovieClip, depth:Number, x:Number, y:Number):Avatar { var av:Avatar = Avatar(target.attachMovie
24、AvatarSymbol”, name, depth)); av.init(x,y); return av; } //设置instance的坐标 public function init(x:Number, y:Number):Void { setState(Avatar.HAPPY); this._x = x; this._y = y; } //初始化instance public function setState(newState:Number):Void { switch (newState) { case Avatar.HAPPY : this.g
25、otoAndStop(”HAPPY”); break; case Avatar.SAD : this.gotoAndStop(”SAD”); break; case Avatar.IDLE : this.gotoAndStop(”IDLE”); break; } } } 注:其中的静态变量和静态函数是可选的,可以根据需求的不同而有所变化。 主文档中: import cn.adamstudio.Avatar; var av:Avatar=Avatar.createAvatar("avatar",_root,0,200,200); 这种方法的特点和优点是用使用子类的静
26、态方法来实例化MovieClip的子类,在主文档中非常简洁。 源文件下载 AS-可正可负随机数的算法 我以前的写法都是: Math.random()*2-1 今天看到一个比较有意思的写法: Math.random()-Math.random() AS3鼠标坐标总结 鼠标是Flash里追主要的互动因素,经常需要侦测鼠标事件(AS3中鼠标事件小结)和得到鼠标的坐标。鼠标坐标的获取可以分为在文档类和在子类中,两种不同的情况。 1)如果是在时间线轴上,或者文档类上使用: stage.mouseX 和 stage.mouseY 2)在子类(如_sprite:Spri
27、te)上使用: _sprite.mouseX 和 _sprite.mouseY 这里得到的是鼠标相对于_sprite的坐标。如果需要的是相对于舞台的坐标,则应该使用localToGlobal,如: var mousePoint:Point=new Point(_sprite.mouseX, _sprite.mouseY); mousePoint=_sprite.localToGlobal(mousePoint); trace("Stage coordinates:"+mousePoint); 注:要使用以上代码别忘了 import flash.geom.Point; AS3练
28、习-往返运动 这是今天做的一个AS3的运动练习,主要是加速和减速运动的配合。发现粒子多了就会出现一些奇怪的现象,比如偶尔会几个粒子在原位置闪动。可能更Flash的代码执行顺序有关,暂时还搞不懂。 as3运行时错误中文说明 1000 系统内存不足。 系统可用内存无法满足 Flash Player 编译代码的需要。请关闭系统上正在运行的某些应用程序或进程。 1001 未实现方法 _。 1002 Number.toPrecision 的范围是 1 至 21。Number.toFixed 和 Number.toExponential 的范围是 0 至 20。指定的值不在期望范围之
29、内。 指定的值不在 precision 参数的期望范围之内。Number.toPrecision 的范围是 1 至 21。Number.toFixed 和 Number.toExponential 的范围是 0 至 20。 1003 radix 参数必须介于 2 至 36 之间;得到 _。 为方法或属性的 radix 参数传递的值小于 2 或大于 36。请传递一个介于 2 至 36 之间的值作为 radix 参数。 1004 对不兼容的对象调用方法 _。 尝试调用的方法不适用于指定对象。如果已将原型函数从一个对象复制到另一个对象然后又调用此函数,但目标对象类型与原始对象类型不同,则会发生此
30、错 误。请确保目标对象与原始对象的类型相同。有关详细信息,请参阅 ECMAScript Language Specification(《ECMAScript 语言规范》)第 3 版中的第 15 章。 1005 数组索引不是正整数 (_)。 尝试使用非正整数的索引值访问数组成员。仅传递正整数作为数组的索引值。 1006 _ 不是函数。 尝试调用不存在的函数时,发生此错误。请确保正在调用正确的函数且自 ActionScript 2.0 以来此 API 尚未发生更改。此外,请确保正在使用正确的对象。例如,使用以下代码时,将出现此错误(由于最后一行错误调用了变量 big 而未调用变量 blg):
31、 var blg:String = “foo”; var big:Sprite = new Sprite(); var error:int = big.length(); 1007 尝试对非构造函数进行实例化。 1008 _ 指代不明确;发现多个匹配的绑定。 1009 无法访问空对象引用的属性或方法。 计算结果为 null 的对象可以不包含任何属性。在某些意外(尽管有效)的情况下,可能发生此错误。以创建 Sprite 对象的以下代码为例。由于从未将此 Sprite 对象添加到显示列表中(使用 DisplayObjectContainer 对象的 addChild() 方法),因此其
32、stage 属性设置为 null。在这种情况下,此示例将生成此错误,这是因为 Sprite 对象的 stage 属性不能拥有任何属性: Read the rest of this entry » AIR-最新RSSReader(基于Flash) 经过长时间的努力,终于用Flash CS3+AS3+AIR Beta2做出了RSSReader 2.0。 前一段时间用html+JS做了个WordpressReader, 虽然实现了自动升级,等很cool的功能,但界面还是比较简朴。 AIR读取Blog RSS - Adobe AIR Beta2 实践 WordpressReader
33、1.1 完成 这次做的RSSReader是基于ActionScript3的,界面漂亮了很多,而且用户体验也有了显著的提高。 程序下载: 初始介面: 文章阅读界面: 实现的功能: 1 读取服务器端XML文档; 2 将读取的XML文档储存到AIR的内建本地数据库SQLite !!!(太酷了!) 3 判断网络连接状况,如果网络畅通就读取并以动画的形式展示文章标题,同时用最新文章刷新SQLite中已有文章。如果网络不通,则读取并显示SQLite中储存的文章; 4 以动画形式展示动画文章标题; 5 自定义事件和文章标题与文章内容之间的切换。 多说也无用,试用一下你就知道Adob
34、e AIR有多强了! 程序下载: Flash-navigateToURL取代getURL AS3中使用navigateToURL取代了getURL,个人感觉navigateToURL最大的好处就是方便了传递参数,不足的地方嘛,据说弹出的新窗口会被浏览器拦截。需要使用:ExternalInterface.call(”window.open”,winurl,”");来避免,但是这是采用了调用JS来做,是必须在浏览器支撑并且JS可以使用的情况下(没有测试)。 另外发现在Adobe AIR中使用navigateToURL打开连接时,只能在新窗口中打开(不会被浏览器拦截),”_self”
35、parent”,”_top”都没有用.而且都是调用浏览器,而不是在AIR中打开. 具体用法如下: package { import flash.display.Sprite; import .navigateToURL; import .URLRequest; import .URLVariables; public class NavigateToURLExample extends Sprite { public function NavigateToURLExample() { var url:String = “”; var variables:URLVari
36、ables = new URLVariables(); variables.exampleSessionId = new Date().getTime(); variables.exampleUserLabel = “Your Name”; var request:URLRequest = new URLRequest(url); request.data = variables; try { navigateToURL(request); } catch (e:Error) { // handle error here } } } } Flash-如何改变动态
37、文本透明度? 因为Flash的系统字体不直接支持透明,所以我们得通过嵌入字体或者Filter类来解决。简单地通过改变动态文本的alpha或者它做在的mc的alpha都是没有用的。 1 嵌入字体 这种方法最简单,选中动态文本框,然后在属性面板中点嵌入(“Embed”)按钮,按后选择要全部字库嵌入,还是只嵌入部分字符。但代价是文件会变大,尤其在嵌入中文字体的时候,绝对是噩梦。当然只是嵌入下载进度0-9这样简单的几个字符,还是非常方便的。 2 Filter 这是从Blueidea学来的,就是给动态文本增加一个滤镜,即使是空滤镜也可以。 AS3中代码 //建立动态文本 var my
38、txt:TextField=new TextField(); my_txt.autoSize = TextFieldAutoSize.LEFT; my_txt.background = true; my_txt.border = true; my_txt.text = “Hello world and welcome to the show.”; //定义滤镜 var txt_blur:BlurFilter = new BlurFilter(0, 0, 0); my_txt.filters = [txt_blur]; my_txt.alpha = 0.5; //加入动态文本
39、 my_txt.x=my_txt.y=50; addChild(my_txt); AS2中代码 import flash.filters.BlurFilter; var txt_blur:BlurFilter = new BlurFilter(0, 0, 0); this.createTextField(”my_txt”, 1, 100, 100, 300, 100); my_txt.text = “DDGGDGDGDGDG”; my_txt.filters = [txt_blur]; my_txt._alpha = 50; 3 BitmapData 和 ColorMatr
40、ixFilter 据HbrO说BitmapData和ColorMatrixFilter也能实现动态文本的半透明效果。但我这人比较懒,发现一种方法之后就犯懒了。以后有时间再研究吧 ,哈哈。 AS3中鼠标事件小结 鼠标事件(MouseEvent)和鼠标位置(AS3鼠标坐标总结)是RIA中最重要的人机交互途径。最近在做一个动态产品展示的系统ProdutShow的时候才发现自己对鼠标事件的了解有多么肤浅。现在ProductShow已经做完了,这里把在使用鼠标事件时要注意的问题总结一下: 1 鼠标事件分为MOUSE_OVER, MOUSE_MOVE, MOUSE_DOWN, MOUSE_
41、UP, MOUSE_OUT, MOUSE_WHEEL和MOUSE_LEAVE。其中前六个事件都来自flash.events.MouseEvent类,最后一个MOUSE_LEAVE却是来自flash.events.Event,在导入类包的时候一定要注意这个问题,因为我在这点上就花了很长时间调试,才得发现问题所在。 MOUSE_OVER - 鼠标移动到目标对象之上时触发, 可以用于模拟按钮的mouse over效果; MOUSE_MOVE - 鼠标在目标对象之上移动时触发,主要用于判断。比如判断在拖拽实例时,实例是否在允许的范围之内,如果超出,立刻停止拖拽或者重新设定实例的坐标; MOUSE
42、DOWN - 鼠标在目标对象之上按下时触发。注意,只有按下鼠标左键时才会触发,右键和滚轮都不会触发。在目标对象之外按下鼠标左键,再移动到目标对象之上时,也不会触发; MOUSE_UP - 鼠标在目标对象之上松开时触发。注意,只有松开鼠标左键时才会触发,右键和滚轮都不会触发。在目标对象之上按下鼠标左键,再移动到目标对象之外松开时,不会触发。但在目标对象之外按下鼠标左键,再移动到目标对象之上松开时,就会触发。 MOUSE_OUT- 鼠标移动到目标对象之外时触发。 MOUSE_WHEEL - 鼠标在目标对象之上转动滚轮时触发。 MOUSE_LEAVE - 当光标离开舞台时触发(stage.
43、addEventListener(Event.MOUSE_LEAVE,leaveHandler);)。在使用自定鼠标后,在鼠标离开舞台时,触发MOUSE_LEAVE事件,然后可以把自定义的鼠标隐藏掉,避免还停留在舞台上。 2 mouseChildren。目标对象中含有子实例时,感应鼠标行为的是子时列,而非目标对象。如果使用 cursor.mouseEnabled=false; 就可以由目标对象来更应鼠标行为。 3 mouseEnabled。当实例重叠时,出于显示列表上方的实例总比下方实例更有优先权感应鼠标行为。当想让下方实例感应鼠标行为时使用 cursor.mouseEnabled=fal
44、se; 即可。这常用于自定义鼠标后,去除自定义鼠标对鼠标行为的干涉,因为自定义鼠标往往一直处于鼠标下方,其他实例无法再感应到鼠标的变化。 另外,也许DOUBLE_CLICK也应该算做鼠标事件,但要使用它,必须先让doubleClickEnabled=true: var bg:Sprite=new Sprite(); bg.doubleClickEnabled=true; bg.addEventListener(MouseEvent.DOUBLE_CLICK,clickHandler); … typeof、is、as的区别 typeof、is、as都是用于判断变量类型的,只
45、是各自的返回值不同。请看下方代码: var a:Number=0; trace(typeof(a));//输出:Number trace(typeof(typeof(a)));//输出:String trace(a is Number);//输出:true trace(a as Number);//输出:0 trace(a as String);//输出:null Null、NaN和undefined的区别 其实Null、NaN和undefined都是变量的默认初始值。变量类型不同,系统给与的初始值就不同: int,uint - 0 Boolean - false
46、 Number - NaN String,Array,Object - null 未指定变量类型 - undefined SwfObject解决Html与Flash之间传递参数问题 在彻底摒弃Adobe的激活ActiveX控件的方法一文中已经详细分析了使用Adobe提供的AC_RunActiveContent.js导致HTML与Flash之间不能传递参数的问题。经过Adobe论坛里GWD的提示,我转而寻求SwfObject的帮助。发现SwfObject是一个很好的解决方案。 SwfObject英文介绍: SwfObject中文翻译: 源文件:SWFObject 1.5 关于
47、SwfObject的介绍上面两篇文章已经讲的很详细了。我这里只列一段标准的应用和一些上面两篇文章没有提到的问题. Html中的JS代码 Read the rest of this entry » 彻底摒弃Adobe的激活ActiveX控件的方法 大家知道,在IE中只有激活了ActiveX控件,Flash才能够与浏览者交互,否则得手动点一下激活。Flash也提供了






