Action Script:
Sprite [sprait] 精灵;雪碧;子画面(画布)
调试函数trace(string)
一般事件:
import flash.events.Event;
addEventListener(Event.ENTER_FRAME,myFunction);
鼠标事件:
import flash.events.MouseEvent;
public function ActionScriptDemo()
{
//在构造函数中定义画布
_sprite = new Sprite();
addChild(_sprite); //增加画布
_sprite.graphics.beginFill(0xeeffcc); //画布的颜色
_sprite.graphics.drawRect(0,0,400,400); //画布的形状
_sprite.graphics.endFill(); //完成绘画
//定义鼠标事件
_sprite.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
_sprite.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
}
private function onMouseDown(event:MouseEvent):void
{
_sprite.graphics.lineStyle(1,0,1); //定义线条属性
_sprite.graphics.moveTo(mouseX,mouseY); //更新起始點
_sprite.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMove); //MouseDown时添加响应事件onMouseMove
}
private function onMouseUp(event:MouseEvent):void
{
_sprite.removeEventListener(MouseEvent.MOUSE_MOVE,onMouseMove);
}
private function onMouseMove(event:MouseEvent):void
{
_sprite.graphics.lineTo(mouseX,mouseY); //画线
}
键盘事件:
private function onKeyDown(event:KeyboardEvent):void
{
trace("key down:" + event.charCode);
}
switch,表达式包括在小括号里;default不用加break;case不加break时可以贯穿。
Timer类是ActionScript3.0新增的类,建议将其用来替代以前的setInterval()和setTimeout()函数。
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class ActionScriptDemo extends Sprite
{
private var _PreviousTime:Number=0;
public function ActionScriptDemo()
{
var tTimer:Timer = new Timer(500,10); //间隔0.5秒,重复10次
tTimer.addEventListener(TimerEvent.TIMER,onTimer);
tTimer.start();
}
private function onTimer(event:TimerEvent):void
{
trace(flash.utils.getTimer() - _PreviousTime); //当前时间-原来时间
_PreviousTime = flash.utils.getTimer();
}
}
//timer part2
private var _square:Sprite;
private var _circle:Sprite;
public function ActionScriptDemo()
{
stage.scaleMode = flash.display.StageScaleMode.NO_SCALE; //没有比例(原始大小)
stage.align = flash.display.StageAlign.TOP_LEFT; //窗口缩放时内容仍左上对齐
_square = new Sprite();
_square.graphics.beginFill(0xffeecc);
_square.graphics.drawRect(0,0,100,100);
_square.graphics.endFill();
addChild(_square);
_square.x = 100;
_square.y = 50;
_circle = new Sprite();
_circle.graphics.beginFill(0xcceeff);
_circle.graphics.drawCircle(50,50,50);
_circle.graphics.endFill();
addChild(_circle);
_circle.x=100;
_circle.y=200;
var squareTimer:Timer = new Timer(50);
squareTimer.addEventListener(TimerEvent.TIMER,onSquareTimer);
squareTimer.start();
var circleTimer:Timer = new Timer(100);
circleTimer.addEventListener(TimerEvent.TIMER,onCircleTimer);
circleTimer.start();
}
private function onSquareTimer(event:TimerEvent):void
{
_square.x ++;
}
private function onCircleTimer(event:TimerEvent):void
{
_circle.x ++;
}
有参方法:
private function average(a:Number,b:Number,c:Number):Number{
return (a+b+c)/3;
}
处理错误:
private function test():void
{
try
{
throw new Error("my error");
}
catch(errObject:Error)
{
trace("The Error Message is: " + errObject.message);
return; //有异常则返回
}
finally
{
trace("whatever it returns or not");
}
trace("can't arrive here");
}
检测操作系统:
var os:String = flash.system.Capabilities.os.substr(0,3);
if(os=="Win") { /*windows专用代码*/ }
else if(os=="Mac") { /*Mac专用代码*/ }
else { /*一定是Unix或Linux*/ }
检查播放器类型:
var type:String = flash.system.Capabilities.playerType;
if(type=="Plugin") { /*Mozilla浏览器*/ }
else if(type=="ActiveX") { /*IE浏览器*/ }
else { /*非浏览器*/ }
检查系统语言:
var lang:String = flash.system.Capabilities.language.substr(0,2);
var ary:Array = ["en","es","fr"];
var useLang:String = "en";
for(var i:int=0;i<ary.length;i++)
{
if(ary[i]==lang)
{
useLang = lang;
break;
}
}
var movieURL:String = "myMovie_" + useLang + ".swf"; //加载相应的影片
禁用常用菜单:
stage.showDefaultContextMenu = false;
检查音频:
if(flash.system.Capabilities.hasAudio) //有声频时
if(flash.system.Capabilities.hasMP3) //可以播放MP3时
产生随机数
Math.random()产生一个介于0和0.999 999 999之间的随机浮点数
产生一个指定范围的随机数并且具有指定的精度
NumberUtilities.random(),此方法最多可以接受三个参数,分别是最小值,最大值,取整数时所用的间距。
定义数组:
var ary:Array = new Array("a","b","c");
var ary2:Array = ["a","b","c"];
var data:Array = ["a",2,true,new Object()];
数组插入数据:
var ary:Array = new Array("a","b","c");
ary[5] = "f"; //ary变成:["a","b","c",undefined,undefined,"f"]
for(var i:int =0;i<ary.length;i++) trace(ary[i]);
搜索数组里某个元素的下标,可以用for历遍,也可以用ArrayUtilities里的静态方法。略。
去掉数组的某个元素,可以用splice ([splais],接合)
var ary:Array = new Array("a","b","c");
ary.splice(2,1); //从下标2处移除一个元素,ary变成:["a","b"]
for(var i:int =0;i<ary.length;i++) trace(ary[i]);
用splice移除数组元素时,必须相应地更改索引变量的值:
var ary:Array = new Array("a","b","c",undefined,undefined,"f");
for(var i:int =0;i<ary.length;i++)
{
if(ary[i]==undefined) ary.splice(i,1);
}
for(var j:int =0;j<ary.length;j++)
{
trace(ary[j]);
}
//以上程序并没有移除所有的undefined元素,ary变成了["a","b","c",undefined,"f"]。
//因为移除ary[3]时,后面的元素下标会向前移(C#也一样),ary[4]变成了f,如果要实现目的,应该这样:
if(ary[i]==undefined)
{
ary.splice(i,1);
i--;
}
数组连接成字符串:
var ary:Array = ["a","b","c"];
trace(ary.join("|")); //a|b|c,没有参数时默认为,
数组排序:
var ary:Array = ["a","c","b"];
ary.sort(); //按字母排,ary.sort(Array.DESCENDING)降序
trace(ary);
默认排序时区分大小写,大写开头的元素会放在前面。如果要不区分大小写,可以用Array.CASEINSENSITIVE。
Array.NUMERIC是以数字值大小为准,而不是编码顺序。可以用来得到最大值和最小值。
Array.UNIQUESORT,只在数组的每个元素都是独一无二时才排序。
Array.RETURNINDEXEDARRAY,得到数组元素的排序顺序,但又不改变原有的数组
数组倒序:ary.reverse(); 如ary为["ab","cd","ef"]时,则输出ef,cd,ab,注意只是元素整体倒序,并不是每个字符
sortOn(),用来根据对象的某个属性排序。如sortOn("NewsTitle");
/*第六章*/
//创建圆形
public function CreateCircle(color:uint,radius:Number,x:Number,y:Number):Shape
{
var shape:Shape = new Shape();
shape.graphics.beginFill(color);
shape.graphics.drawCircle(x,y,radius);
shape.graphics.endFill();
return shape;
}
Sprite是去掉了时间轴的MovieClip(即阉割版MovieClip)。
Sprite不同于Shape,区别就在于Sprite是容器,而Shape不是。从代码角度说就是,Sprite可以addChild(),但Shape不可以。
Sprite支持鼠标单击事件,而Shape不支持。
移除图形:
private var text:TextField;
public function ActionScriptDemo()
{
text = new TextField();
text.text = "ookk";
addChild(text); //因为这里是加到sprite上(继承了sprite)
stage.addEventListener(MouseEvent.CLICK,removeText);
}
public function removeText(event:MouseEvent):void
{
removeChild(text); //所以这里不能加stage
}
addChildAt和removeChildAt汲及到index,略
setChildIndex(a,getChildIndex(b)); a和b的高低位置会调转。
导入图片:
把测试图片放到html-template(swf所在的目录)下。
stage.scaleMode = flash.display.StageScaleMode.NO_SCALE; //没有比例(原始大小)
stage.align = flash.display.StageAlign.TOP_LEFT; //窗口缩放时内容仍左上对齐
var loader:Loader = new Loader();
loader.load(new URLRequest("test.gif"));
addChild(loader);
//加上进度显示:
public function ActionScriptDemo()
{
stage.scaleMode = flash.display.StageScaleMode.NO_SCALE; //没有比例(原始大小)
stage.align = flash.display.StageAlign.TOP_LEFT; //窗口缩放时内容仍左上对齐
var loader:Loader = new Loader();
loader.load(new URLRequest("test.gif"));
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.OPEN,handleOpen);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,handleProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,handleComplete);
}
private function handleOpen(event:Event):void
{
trace("open");
}
private function handleProgress(event:ProgressEvent):void
{
var percent:Number = event.bytesLoaded/event.bytesTotal * 100;
trace("progress,percent = " + Math.ceil(percent).toString()+"%"); //取整显示
}
private function handleComplete(event:Event):void
{
trace("complete");
}
//鼠标点击事件
private function onClick(event:MouseEvent):void
{
trace("click" + event.localX + event.localY); //可以用坐标判断做某事
}
//画直线
var s:Sprite = new Sprite();
s.graphics.lineStyle(1); //定义画线属性
s.graphics.moveTo(0,0); //初始点
s.graphics.lineTo(100,100); //终点
addChild(s);
//曲线:Graphics.curveTo(),矩形:Graphics.drawRect(),圆形:Graphics.drawCircle(),
//椭圆:Pen.drawEllipse(),弧线:pen.drawArc(),三角形:Pen.drawTriangle(),正多边形:Pen.drawRegularPolygon(),星形:Pen.drawStar()。
//文本框:
var txt:TextField = new TextField();
txt.border=true; //边框
txt.borderColor = 0xffccee; //边框色
addChild(txt); //加入舞台
txt.background = true; //为了设置背景色,仍然起作用
txt.backgroundColor = 0xe3e3e3; //默认为白色
txt.type = TextFieldType.INPUT; //可输入
txt.displayAsPassword = true; //密码形式输入
//txt.selectable = false; //可选择,默认为true,false时不可输入
txt.restrict = "abc"; //过滤字符,只能输入a或b或c
txt.restrict = "0-9"; //只能输入数字
txt.restrict = "a-zA-Z"; //只能输入字母
txt.restrict = "a-zA-Z "; //只能输入字母和空格
txt.restrict = "^abc"; //除了小写字母a到c,注意输入abc时会自动转成大写
txt.restrict = "^a-z"; //除了小写字母
txt.restrict = "0-9^5"; //0到9除了5
txt.maxChars = 6; //最长6个字符
txt.text = "ookkhahaxixi"; //显示文本,不受maxChars影响
txt.appendText("ookk"); //追加文本
txt.htmlText = "<u>this is underlined text</u>"; //会解释为html(text属性则不会),会覆盖掉text属性
txt.condenseWhite = true; //缩减空白,只留一个空白(htmltext时有效)
txt.htmlText = "hello world"; //显示 hello world
txt.autoSize = "left"; //文本向左对齐(自动调整文本框大小),还支持right,center,none
txt.scrollV = 1; //滚动至顶端
txt.scrollV += 1; //滚动至下一行
txt.scrollV = 6; //滚动至第六行
txt.scrollV = txt.bottomScrollV; //滚动至下一页,保留上一页最后一项
txt.scrollV = txt.bottomScrollV + 1; //滚动至下一页,不存在上一页信息
txt.scrollH = 0; //滚动至最左
txt.scrollH += 1; //向右滚动1像素
txt.scrollH = txt.maxScrollH; //滚动至最右
txt.mouseWheelEnabled = true; //鼠标轮滚动
//可以响应滚动事件 txt.addEventListener(Event.SCROLL,myFun);
//样式
var formatter:TextFormat = new TextFormat();
formatter.bold = true; //字体加粗
formatter.color = 0xffeecc; //颜色
formatter.blockIndent = 2; //每段首行缩进(略)
txt.setTextFormat(formatter); //应用样式
txt.text = "rewrite"; //重新赋值后格式自动取消
txt.setTextFormat(formatter); //要重新赋格式
//txt.defaultTextFormat = formatter; 可以设置默认格式,这样格式就不会丢掉了
//加载css样式
public function ActionScriptDemo()
{
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("css.css"); //定义下载信息
loader.load(request); //加载下载信息
loader.addEventListener(Event.COMPLETE,onLoadCss); //定义完成事件
}
private function onLoadCss(event:Event):void
{
var css:StyleSheet = new StyleSheet();
css.parseCSS(URLLoader(event.target).data); //通过URLLoader的事件目标取得css的data
var field:TextField = new TextField();
field.styleSheet = css; //应用样式
field.autoSize = "left";
field.wordWrap = true;
field.width = 200;
field.htmlText = "<p>ookk</p>";
addChild(field);
}
//选择字符
var txt:TextField = new TextField();
txt.text = "abc";
stage.focus = txt; //为了选择字符
txt.setSelection(0,2);
addChild(txt);
//文本响应事件:
FocusEvent.FOCUS_IN(当焦点移进文本时),FocusEvent.FOCUS_OUT(焦点移出),TextEvent.TEXT_INPUT(内容改变)
//超链接事件/点击事件
public function ActionScriptDemo()
{
var txt:TextField = new TextField();
//txt.htmlText = "<a href='http://www.baidu.com'>abc</a>"; //正常的超链接事件
txt.htmlText = "<a href='event:http://www.ookk.com'>abc</a>"; //利用event实现自义定事件,href的值不必为有效的URL
txt.addEventListener(TextEvent.LINK,test);
addChild(txt);
}
private function test(event:TextEvent):void{
trace("click me");
}
/*第十章 滤镜和转换 略*/
//移动对象
addEventListener(Event.ENTER_FRAME,myFun); //定义ENTER_FRAME事件
...
private function myFun(event:Event):void{ _sprite.x += 3; }
var _timer:Timer = new Timer(1000); //定义Timer对象
_timer.addEventListener("timer",onTimer);
_timer.start();
...
private function onTimer(event:Event):void{ _sprite.x += 3; }
//角度计算:一个圆是360度,2PI弧度。
想以135度及每帧4像素的速率移动:(速度=有方向的速率)
==>要计算出X和Y的速度
vx = Math.cos(angle) * speed; //x方向的速率=Math.cos(角度)*速率
vy = Math.sin(angle) * speed;
==>onTimer(event:TimerEvent)函数
_sprite.x -= vx; //cos(钝角)为负值
_sprite.y += vy;
//代码
private var _sprite:Sprite;
private var _angle:Number = 135;
private var _speed:Number = 4;
private var _timer:Timer;
public function ActionScriptDemo()
{
_sprite = new Sprite();
_sprite = ExtendPackage.CreateShape.CreateCircle(0x0000ff,25,0,0); //造圆
addChild(_sprite);
_timer = new Timer(30);
_timer.addEventListener("timer",onTimer);
_timer.start();
}
public function onTimer(event:TimerEvent):void{
var radians:Number = _angle * Math.PI / 180;
var vx:Number = Math.cos(radians) * _speed;
var vy:Number = Math.sin(radians) * _speed;
_sprite.x -= vx;
_sprite.y += vy;
}
//缓慢移动:每次按照剩余距离的N分之1来移动
private var _sprite:Sprite;
private var _targetX:Number = 400;
private var _targetY:Number = 200;
private var _timer:Timer;
private var _easingSpeed:Number = 0.1; //移动1/10
public function ActionScriptDemo()
{
_sprite = new Sprite();
_sprite = ExtendPackage.CreateShape.CreateCircle(0x0000ff,25,0,0);
addChild(_sprite);
_timer = new Timer(30);
_timer.addEventListener("timer",onTimer);
_timer.start();
}
public function onTimer(event:TimerEvent):void{
var vx:Number = (_targetX - _sprite.x) * _easingSpeed;
var vy:Number = (_targetY - _sprite.y) * _easingSpeed;
_sprite.x += vx;
_sprite.y += vy;
}
//存在问题,即使对象已经非常接近目标,计时器还是会继续跑下去。解决思路:如果距离少于某特定值就关掉计时器
public function onTimer(event:TimerEvent):void
{
var dx:Number = _targetX - _sprite.x;
var dy:Number = _targetY - _sprite.y;
var dist:Number = Math.sqrt(dx*dx + dy*dy);
if(dist<1) //距离小于1则停止
{
_sprite.x = _targetX;
_sprite.y = _targetY;
_timer.stop();
}
else
{
var vx:Number = dx * _easingSpeed;
var vy:Number = dy * _easingSpeed;
_sprite.x += vx;
_sprite.y += vy;
}
}
//弹性:
private var _sprite:Sprite;
private var _vx:Number = 20;
private var _vy:Number = 0;
private var _k:Number = 0.1;
private var _damp:Number = 0.94;
private var _targetX:Number = 200;
private var _targetY:Number = 200;
public function ActionScriptDemo()
{
_sprite = new Sprite();
_sprite = ExtendPackage.CreateShape.CreateCircle(0x0000ff,25,0,0);
addChild(_sprite);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
public function onEnterFrame(event:Event):void{
var ax:Number = (_targetX - _sprite.x) * _k;
var ay:Number = (_targetX - _sprite.x) * _k;
_vx += ax;
_vy -= ay;
_sprite.x += _vx;
_sprite.y += _vy;
_vx *= _damp;
_vy *= _damp;
}
//字符串
AS(ActionScript)没有区分单一字符和字符串。字符和字符串都属于String类型。
如果要输出多个数字连接起来的字符串(不是数字相加),可以在开始处接一个空字符串。如:
var first:int = 1;
var second:int = 2;
var result:String = "" + first + second;
如果把空字符串放在最后,则会先把两数相加,再转成字符串输出(和C#一样)
字符串中有双引号时,可以用转义字符串把双引号转义再输出
查找子字符串:indexOf(),lastIndexOf()
提取子字符串:substring(),substr(),slice() //slice可接受负数
分解字符串:split(),AS里用单/双引号都行,C#里用单引号。
移除和替换字符串:replace(),或split()和join()结合使用
取出一个字符:String.charAt()
转换大小写:toUpperCase(),toLowerCase()
//声音编程
private var _sound:Sound;
public function ActionScriptDemo()
{
_sound = new Sound();
_sound.load(new URLRequest("test.mp3"));
//以上两句等价于:_sound = new Sound(new URLRequest("test.mp3"));
//为声音加上缓冲:_sound = new Sound(new URLRequest("test.mp3"),new SoundLoaderContext(5000)); //建立5秒缓冲区
_sound.play();
//_sound.play(5500); //声音从5秒处开始播放
//推而广之,一段声音可以设置几个播放点,当用户点击某个按钮时,将播放点传进去
//_sound.play(0,3); //从开始处播放,循环3次
//var _channel:SoundChannel = _sound.play(); //可以用来监听声音是否播放完成
//_channel.addEventListener(Event.SOUND_COMPLETE,onComplete); //在onComplete播放下一首
}
//取得声音大小/百分比
private var _sound:Sound;
public function ActionScriptDemo()
{
addEventListener(Event.ENTER_FRAME,onEnterFrame);
_sound = new Sound();
_sound.load(new URLRequest("http://www.xxx.com/somestringfrombaidump3.mp3"));
_sound.play();
}
public function onEnterFrame(event:Event):void{
var barWidth:Number = 200;
var barHeight:Number = 5;
var loaded:int = _sound.bytesLoaded;
var total:int = _sound.bytesTotal;
if(total>0)
{
graphics.clear();
graphics.beginFill(0xffccee);
graphics.drawRect(10,10,barWidth,barHeight);
graphics.endFill();
var percent:Number = loaded/total;
graphics.beginFill(0xcccccc);
graphics.drawRect(10,10,barWidth*percent,barHeight); //第二次画图;起始坐标一样
graphics.endFill();
}
}
//取得歌曲信息
public function ActionScriptDemo()
{
_sound = new Sound();
_sound.load(new URLRequest("test.mp3"));
_sound.addEventListener(Event.ID3,onID3);
_sound.play();
}
public function onID3(event:Event):void{
var id3Display:TextField = new TextField();
addChild(id3Display);
id3Display.x = 10;
id3Display.y = 20;
id3Display.width = 200;
id3Display.height = 200;
id3Display.background = true;
id3Display.multiline = true;
id3Display.wordWrap = true;
id3Display.appendText("begin\n");
id3Display.appendText(_sound.id3.songName + "\n");
id3Display.appendText(_sound.id3.artist + "\n");
id3Display.appendText(_sound.id3.album + "\n");
id3Display.appendText(_sound.id3.year + "\n");
id3Display.appendText("end\n");
}
//跟踪声音播放速度
private var _sound:Sound;
private var _channel:SoundChannel;
public function ActionScriptDemo()
{
addEventListener(Event.ENTER_FRAME,onEnterFrame);
_sound = new Sound();
_sound.load(new URLRequest("http://www.xxx.com/somestringfrombaidump3.mp3"));
_channel = _sound.play();
}
public function onEnterFrame(event:Event):void{
var barWidth:Number = 200;
var barHeight:Number = 5;
var loaded:int = _sound.bytesLoaded;
var total:int = _sound.bytesTotal;
var length:int = _sound.length;
var position:int = _channel.position; //播放位置
graphics.clear();
graphics.beginFill(0xeeccff);
graphics.drawRect(10,10,barWidth,barHeight);
graphics.endFill();
if(total>0)
{
var percentBuffered:Number = loaded/total;
graphics.beginFill(0xcccccc);
graphics.drawRect(10,10,barWidth*percentBuffered,barHeight);
graphics.endFill();
length /= percentBuffered;
var percentPlayed:Number = position / length; //播放位置/总长度=播放百分
graphics.beginFill(0x666666);
graphics.drawRect(10,10,barWidth*percentPlayed,barHeight);
graphics.endFill();
}
}
//暂停和重启声音
private var _sound:Sound;
private var _channel:SoundChannel;
private var _playPauseButton:Sprite;
private var _playing:Boolean = false;
private var _position:int;
public function ActionScriptDemo()
{
_sound = new Sound();
_sound.load(new URLRequest("http://api.ning.com/files/EmiY8MvYE7-InlLGvoTGHkdYGmvaQIcZvWK3mcHnnfQJ97xKLx3aBL9dYzw8UmFvYrsYHsyGEFIWn3i2bmgYZ47s-38rUNZi/file.mp3?stdfrom=3"));
_channel = _sound.play();
_playing = true;
//画停止按钮
_playPauseButton = new Sprite();
addChild(_playPauseButton);
_playPauseButton.x = 10;
_playPauseButton.y = 20;
_playPauseButton.graphics.beginFill(0xcccccc);
_playPauseButton.graphics.drawRect(0,0,20,20);
//增加事件
_playPauseButton.addEventListener(MouseEvent.MOUSE_UP,onPlayPause);
}
public function onPlayPause(event:MouseEvent):void{
if(_playing){ //如果是正在揪放时点击
_position = _channel.position; //记录位置
_channel.stop();
}
else{ //播放
_channel = _sound.play(_position);
}
_playing = !_playing;
}
//声音音量
_channel = _sound.play();
var transform:SoundTransform = new SoundTransform();
transform.volume = 0.3; //30%的声音
//以上两句等价于:var transform:SoundTransform = new SoundTransform(0.3);
//还可以加声道参数,其值从-1.0(全左声道)到1.0(全右声道),如new SoundTransform(0.3,-1.0);
_channel.soundTransform = transform;
//视频播放
public function ActionScriptDemo()
{
_video = new Video(160,120);
_duration = 0;
_playbackTime = new TextField();
_playbackTime.autoSize = "left";
_playbackTime.y = 120;
var connection:NetConnection = new NetConnection(); //定义数据源
connection.connect(null); //null用于渐进式下载的视频
var client:Object = new Object(); //定义回调函数
client.onMetaData = onMetaData;
_stream = new NetStream(connection); //取回/加载数据
_stream.client = client; //加载完后会自动调用onMetaData回调方法
_video.attachNetStream(_stream); //把数据流附加到video对像进行转换
_stream.play("1.flv"); //播放视频
addChild(_video);
addChild(_playbackTime);
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function onMetaData(data:Object):void
{
_duration = data.duration; //总长
}
private function onEnterFrame(data:Event):void
{
if(_duration > 0 && _stream.time >0)
{
_playbackTime.text = Math.round(_stream.time) + " / " + Math.round(_duration);
}
}
//视频缩放
_stream.addEventListener(NetStatusEvent.NET_STATUS,onStatus); //视频下载完后调整视频大小
private function onStatus(event:NetStatusEvent):void
{
if(_video.videoWidth > 0 && _video.width != _video.videoWidth)
{
_video.width = _video.videoWidth;
_video.height = _video.videoHeight;
}
}
//视频播放/暂停
_playPauseButton.addEventListener(MouseEvent.CLICK,onPlayPause); //_playPauseButton:Sprite
private function onPlayPause(event:MouseEvent):void
{
_stream.togglePause();
}
//停止视频:当使用pause()时,视频只支暂停,而且数据还是会持继下载。如果想完全停止视频的下载,就使用close()方法。
//控制播放时间:使用videoStream.seek(),如videoStream.seek(5)表示从开头前进5秒。
/*第17章 存储持久化数据*/
本地共享对象(local shared object,LSO),远程共享对象(remote shared object,RSO)
//把数据写入共享对象
var example:SharedObject = SharedObject.getLocal("example");
example.data.someData = "a valeu"; //把一个名为someData的属性存在example共享对象的data中
//序列化自定义类
//自定义类:
package ExtendPackage
{
public class Person
{
private var _name:String;
private var _age:int;
public function Person(name:String, age:int)
{
_name = name;
_age = age;
}
public function toString():String
{
return _name + " is " + _age + " years old";
}
}
}
//主程序
package
{
import ExtendPackage.Person;
import flash.display.Sprite;
import flash.net.SharedObject;
import flash.net.registerClassAlias;
public class ActionScriptDemo extends Sprite
{
public function ActionScriptDemo()
{
registerClassAlias("ExtendPackage.Person",Person);
var example:SharedObject = SharedObject.getLocal("example");
if(example.data.person == undefined)
{
trace("first time,saving person instance");
var person:Person = new Person("terry",25);
example.data.person = person;
}
else
{
trace("person instance already saved, using stored values");
}
trace(example.data.person.toString());
}
}
}
/*第18章 与其它影片通信 */
略
/*第19章 发送和加载数据*/
略
/*第20章 XML*/
//创建XML对象
var name:String = "terry";
var score:int = 1000;
var str:String = "<gamescore><name>" + name + "</name><score>" + score + "</score></gamescore>";
var example:XML = new XML(str);
//以上两句等价于:var example:XML = <gamescore><name>{name}</name><score>{score}</score></gamescore>
//添加元素
var example:XML = <example/>
example.newElement = <newElement/>;
//等价于:example.newElement = "";
trace(example);
//动态结点名(把.改成[];当结点名中有-号时也要使用[]而不能使用.)
var example:XML = <example/>
var id:int = 10;
example["user" + id] = ""; //把user10做为结点名
trace(example);
//播入结点
var example:XML = <example/>
example.two = "";
example = example.insertChildBefore(example.two,<one />);
example = example.insertChildAfter(example.two,<three />);
trace(example);
//还有appendChild(),prependChild,insertChildAfter,insertChildBefore
//添加属性到结点(当属性名中有-号时也要使用[]而不能使用.)
var example:XML = <example><someElement/></example>;
example.someElement.@number = 12.1;
example.someElement.@string = "example";
example.someElement.@boolean = true;
example.someElement.@array = ["a",null,7,undefined,"c"];
trace(example);
//输出
<example>
<someElement number="12.1" string="example" boolean="true" array="a,,7,,c"/>
</example>
//动态属性名使用[]
//读取XML树中的元素
var menu:XML = <menu>
<menuitem label="file">
<menuitem label="new"/>
</menuitem>
<menuitem label="help">
<menuitem label="about"/>
</menuitem>
this is a text node
</menu>;
for each(var element:XML in menu.elements())
{
trace(element.@label);
}
//显示file和help,并没有显示new和about,因为它们并非menu元素的直接子结点。要遍历整棵树,需要用到递归函数(for each改成walk(menu)):
private function walk(node:XML):void //类型也是XML
{
for each(var element:XML in node.elements())
{
trace(element.@label);
walk(element);
}
}
//通过名称查找元素
var fruit:XML = <fruit><name>Apple</name></fruit>;
trace(fruit.name);
var author:XML = <author><name><firstname>terry</firstname></name></author>;
trace(author.name.firstname);
//如果不知道详细路径可以使用双点运算符,如:author..firstname
//当数据项不至一条时,可以使用索引式。如:author.name[0].firstname
//计算元素的数目:author.name.length();
//读取文本节点及其值
var example:XML = <example>
<string>ookk</string>
<bool>true</bool>
<bool2>false</bool2>
<integer>12</integer>
<number>.9</number>
</example>;
var string:String = example.string.toString();
var bool:Boolean = Boolean(example.bool);
var bool2:Boolean = Boolean(example.bool2);
var integer:int = int(example.integer);
var number:Number = example.number;
trace(string);
trace(bool);
trace(bool2); //输出true
trace(integer);
trace(number);
//上面的bool2并没有像想象中一样会输出false,而是输出了true。正确的做法应该是:
var bool2:Boolean = example.bool2.toLowerCase() == "true";
//混合元素取文本:
var fruit:XML = <fruit>
<name>Apple</name>
an apple a day...
</fruit>;
var value:String = fruit.toString();
trace(value);
//输出:
<fruit>
<name>Apple</name>
an apple a day...
</fruit>
//可以用text(),只返回元素的文本
for each(var textNode:XML in fruit.text())
{
trace(textNode);
}
//输出:an apple a day...
//读取元素的属性
var fruit:XML = <fruit name="apple" color="red" />;
var attrs:XMLList = fruit.attributes();
trace(attrs[0]); //apple
trace(attrs[1]); //red
trace(attrs[1].name()); //color
trace(fruit.@color); //red
trace(fruit.attribute("color")); //red
//移除元素、文本节点和属性
var example:XML = <example>
<fruit color="red">apple</fruit>
<vegetable color="green">broccoli</vegetable>
<dairy color="white">milk</dairy>
</example>;
delete example.fruit.@color; //属性
delete example.dairy; //元素
delete example.vegetable.text()[0]; //文本节点
trace(example);
//输出:
<example>
<fruit>apple</fruit>
<vegetable color="green"/>
</example>
//循环把全部属性去掉
var example:XML = <example><fruit color="red" name="apple" /></example>;
var attrs:XMLList = example.fruit.@*; //取得fruit的属性列表
for(var i:int = attrs.length()-1;i>=0;i--) //从数组尾端开始,可以避免循环时数组索引发生变化的问题
{
delete attrs[i];
}
trace(example);
//读取XML
public function ActionScriptDemo()
{
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest("test.xml"));
loader.addEventListener(Event.COMPLETE,handleComplete);
}
private function handleComplete(event:Event):void{
try
{
var example:XML = new XML(event.target.data);
trace(example);
}
catch(e:TypeError)
{
trace("error: " + e.message);
}
}
//在xml中使用html和特殊字符,使用<![CDATA[。。。]]>
<test>
<name>terry</name>
<html><![CDATA[mystrbegin a < b mystrend]]></html>
</test>
/*第21章 Web Services 和 Flash Remoting*/
/*第22章 建立集成应用程序*/
/*第23章 文件管理*/
/*第24章 Socket编程*/