AS2.0学习笔记

这几天一直在做一个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简体中文帮助文档

2 条评论在 “AS2.0学习笔记

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据