这几天一直在做一个flash网站的项目,需要用AS2.0制作留言,留言列表,选取头像以及加载进度条等功能,如果让专业人士来做,估计一天就完事了,可惜在下对flash完全一窍不通,只能边学边做,昨天项目结束,趁现在不忙写下学习笔记,
以下将按我的理解由易到难的顺序发布,使用myText代表输入文本名称,myMc代表影片剪辑名称,myBtn代表按钮名称。
1、获取输入文本值
var textVal = myText.text;
2、元件基本属性
可访问性:myMc._visible=0 设置myMc为不存在,即无法看见也无法触发事件,反之为1;
透明度:myMc._alpha=0 设置myMc不可见,但仍然可以触发事件,值为0到100;
坐标:myMc._x 横坐标 myMc._y 纵坐标。
3、绑定事件
鼠标按下事件:myBtn.onPress=function(){} 元件也适用,以下不做赘述;
鼠标松开事件:myBtn.onRelease=function(){}。
4、读取xml文档
假设有以下xml文档是由“admin/xmllist.asp”生成。
1 2 3 4 5 6 7 8 | <?xml version='1.0' encoding='utf-8'?> <XML total='5' pageNum='0'> <item id="36" name="1231231" context="asdsadh" visit_time="2011/2/22 18:10:10" gif_dir="003.jpg" email="aasdasdas@asd.com"> </item> <item id="29" name="撒阿" context="阿斯大声萨大声大" visit_time="2011/2/22 13:51:25" gif_dir="020.jpg" email="asaasd@123.com"> </item> <item id="30" name="撒阿打" context="阿斯大啊是" visit_time="2011/2/22 13:51:40" gif_dir="020.jpg" email="asaasd@123.com"> </item> <item id="31" name="撒斯大" context="阿斯大声大" visit_time="2011/2/22 13:51:43" gif_dir="020.jpg" email="asaasd@123.com"> </item> <item id="32" name="撒声算" context="阿斯大声" visit_time="2011/2/22 13:51:46" gif_dir="020.jpg" email="asaasd@123.com"> </item> </XML> |
通过以下语句读取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | var userName:Array=new Array(); var email:Array=new Array(); var context:Array=new Array(); var visitTime:Array=new Array(); //创建数组存储xml数据 var myXML = new XML(); //创建xml对象 var date= new Date(); //创建时间对象 var randomNum:Number=random(9999)+date.getMinutes()*date.getSeconds(); //设置随机数 myXML.load("admin/xmllist.asp?rnum="+randomNum); //加载xml文件,并通过随机数避免缓存 myXML.onLoad = function(success){ var itemLength:Number=myXML.firstChild.attributes['total']; //获取xml节点数量,方法很多,自己Google,我是图省事 var aNode:XMLNode = myXML.firstChild.firstChild; //创建节点对象并赋值 var xmlIndex=0; for (xmlIndex;xmlIndex<itemLength;xmlIndex++){ userName.push(aNode.attributes['userName']); //读取节点属性并添加入数组 email.push(aNode.attributes['email']); context.push(aNode.attributes['context']); visitTime.push(aNode.attributes['visitTime']); aNode=aNode.nextSibling; //赋值下一个节点 } } |
5、动态添加影片剪辑
预先创建元件myItem,内含userName、email、context、visitTime4个输入文本,排列方式为竖向排列,动态添加后需要调整位置。
使用以下语句动态添加myItem到_root:
1 2 3 4 5 6 7 8 9 | for (var xmlIndex=0;xmlIndex<userName.length;xmlIndex++){ _root.attachMovie('myItem','myItem'+xmlIndex,_root.getNextHighestDepth()); //从库中寻找myItem添加到_root,自动调整深度,并命名为'myItem'+xmlIndex _root['myItem'+xmlIndex].userName.text=userName[xmlIndex]; _root['myItem'+xmlIndex].email.text=email[xmlIndex]; _root['myItem'+xmlIndex].context.text=context[xmlIndex]; _root['myItem'+xmlIndex].visitTime.text=visitTime[xmlIndex]; //赋值 _root['myItem'+xmlIndex]._y=xmlIndex*200; //调整位置,myItem高为190,留10的间隔 } |
当然你也可以在xml的onLoad事件的循环里直接添加元件,不必非要创建数组对象存储数据,这只是我为了以后操作数据方便。
6、动态添加图片或flash
myMc.loadMovie(‘1.jpg’),可以是SWF、JPEG、GIF或PNG文件,需要注意的是当影片剪辑loadMovie()后会导致绑定事件失效,并且无法再绑定事件,我的解决办法是attacMovie()一个与myMc大小位置相同影片剪辑并设为透明覆盖上去,再绑定事件。
看到网上有朋友说解决办法是借助MovieClipLoader,转自http://hgfghww7.javaeye.com/blog/635660:
1 2 3 4 5 6 7 8 9 10 11 | imageMc = mainContainer.createEmptyMovieClip("imageMc",1); //imageMc.loadMovie("E:\\1.jpg"); //不能用这种方法 var loader:MovieClipLoader = new MovieClipLoader(); loader.loadClip("E:\\1.jpg", imageMc); var mclListener:Object = new Object(); mclListener.onLoadInit = function(evt:MovieClip) { evt.onPress = function() { trace("bbb"); } } loader.addListener(mclListener); |
7、加载进度条实现
total = _root.getBytesTotal() 得到许下载文件的大小;
loaded = _root.getBytesLoaded() 已经下载文件的大小;
然后2个相除 loaded/total 得到比例,这是原理,具体怎么实现有很多方法,比如你可以设置个100帧的动画,根据比值播放哪个帧,又或者设置动态文本显示数值。
我的方法是在flash前面加两个空白帧,添加一个循环动画及一个动态文本,注意这两个只显示两帧,后面的要删掉。
然后在第一帧添加如下代码:
1 2 3 4 | bytesLoaded = _root.getBytesLoaded(); bytesTotal = _root.getBytesTotal(); loc = Math.round(bytesLoaded / bytesTotal * 100); text_info.text=loc+'%'; |
第二帧添加如下代码:
1 2 3 4 5 6 7 8 | if (bytesLoaded == bytesTotal) { play (); //加载完成就播放后面 } else { gotoAndPlay(1); //未加载完成返回第一帧 } |
8、表单提交
表单提交并不是最难的,只是我把它忘了所以又添加进来而已。
我在flash里新建了3个输入文本分别名为userName,email,context,以及两个按钮submitForm和reback。在第一帧添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | submitform.onRelease=function(){ function isEmail() { //判断Email格式是否正确 if (email.text.charAt(0) == "." || email.text.charAt(0) == "@" || email.text.indexOf('@', 0) == -1 || email.text.indexOf('.', 0) == -1 || email.text.indexOf('.@', 0) != -1 || email.text.indexOf('@.', 0) != -1 || email.text.indexOf('..', 0) != -1 || email.text.lastIndexOf("@") != email.text.indexOf("@") || email.text.lastIndexOf("@") == email.text.length-1 || email.text.lastIndexOf(".") == email.text.length-1) { return false; } return true; } if (userName.text=="" || email.text=="" || context.text==""){ gotoAndStop(2); //判断各输入文本是否为空,为空则播放第二帧,提示用户 }else if(!isEmail()){ gotoAndStop(3); //Email格式错误,播放第三帧 }else if (userName.text != "" && email.text != "" && context.text != ""){ var myload = new LoadVars(); //创建对象 myload.userName = userName.text; //赋值 myload.email = email.text; myload.context=context.text; myload.sendAndLoad("insert_message.asp", myload, "POST"); //提交表单 myload.onLoad=function(success){ if(success){ if(myload.a == "1") { gotoAndStop(4); //返回a=1则留言成功 }else{ gotoAndStop(5); //其他则留言失败 } }else{ gotoAndStop(5); } } } } reback.onRelease=function(){ gotoAndStop(1); userName.text = ''; email.text = ''; context.text = ''; //清空事件 } |
总结
actionscript跟javascript有很多相似之处,比如变量,语法,事件绑定等,不过从头学习还是要下一番功夫,这几天一直是一边看文档,一边搜索,一边瞎蒙着写,忙的昏天黑地,延迟加载到现在还没写完,回头再说吧,慢慢来,比较快。
推荐一个flash8帮助文档,新手用来查些类,方法和事件很有帮助,下载链接: flash8简体中文帮助文档
哇。好才华。flash都会~第一段第四行纠错,“民称”改为“名称”
嘿嘿,学了一点点