属性的作用在于直接访问的属性的方法来更新值,却可以同时增加方法进行验证
要发送事件.需要继承EventDispatcher,然后调用dispatchEvent()方法
检查客户端系统,可以使用flash.system.Capabilities来做判断其中包括了客户端Flash Player版本以及操作系统,分辨率
flash.system.Security.showSettings(); 用于打开本地设置界面
使用 flash.system.Security.allowDomain( ) , flash.system.Security.allowInsecureDomain( ) , 或 一个 策略文件。
第一种用于http的访问, 第二种用于基于https://的访问,其中都可以使用参数url来设置允许访问的url
也可以直接使用策略文件
<?xml version="1.0"?>
<!-- http://www.mydomain.com/crossdomain.xml -->
<cross-domain-policy>
<allow-access-from domain="www.otherdomain.com" />
<allow-access-from domain="*.adobe.com" />
<allow-access-from domain="123.45.67.89" />
</cross-domain-policy>
该文件被命名为 crossdomain.xml 。 通过 flash.system.Security.loadPolicyFile( ) 读取文件
ActionScript 3.0 有三种基本数字类型: number , int , 和 uint 。 number 对应浮点数, int 和 u int
对应整数。 int 和 uint 的区别就是 uint 代表无符号整数
十六进制以 0x 开头,八进制以 0 开头,二进制不能直接表示,可以用等价的八进制或十六进制 或用 parseInt( ) 函数转换字符为数字。
在 ActionScript 中不管你怎么设置数字,它的内部结果总是以十进制存贮,可以使用toString("类型")进行指定进制的转换输出
同样颜色的rgb值也可以使用toString("类型")来用于输出
也可以使用parseInt("值","进制类型") 进行指定类型的格式转换
以上两种默认均为10进制
用Math.round( )进行四舍五入,Math.floor( )和Math.ceil( )进行上下近似值.NumberUtilities.round( ) 方法可自定义取值。
计算两点之间的距离
通过勾股定理可以计算出两点之间的距离(直线)。一个三角形,最长边的平方等于其他两边 的
平方和:
var c:Number = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
数组的排序,主要使用sort方法.其中重要的是传递进去的参数,均为Array的常量
两个常量 Array.UNIQUESORT 和 Array.RETURNINDEXEDARRAY . ,如果你只是对含有唯一元素的数组排序就可以用 Array.UNIQUESORT , Flash 只会对这样的数组排序,不满足条件sort( ) 返回 0 ,且不进行排序:
Array.RETURNINDEXEDARRAY 得到排序后数组元素的下标顺序,但不改变原始数组:
使用 Array.NUMERIC 常量才能正常对数字排序:
如果对数字内容的数组排序,则根据第一个数字的 ASCII 排序
使用 Array.CASEINSENSITIVE 常量忽略大小写进行排序:
如果要进行降序排序,需要传递参数 Array.DESCENDING 常量
可以使用|连接这些常量
用 reverse( ) 方法反转数组
对于复杂的对象数组,可以使用sortOn()方法,其中传递的参数为字符串指定名称属性cars.sortOn(["year", "make"]);
其中的两个均为属性,表示先对year排序,再对make排序
自定义排序传递一个2个参数的并且返回一个int值的function名
画一条直线
lineTo( ) 把笔刷当前位置作为起点,类似的还有 curveTo( ) , 或 moveTo( ) 方法。默认笔刷的起始 坐
标为 (0,0) 。 moveTo( ) 方法不会画出东西,它直接把笔刷移动到目标位置
curveTo( ) 用于绘制曲线
Loader的加载事件监听需要放置在contentLoaderInfo属性内,而且返回的结果放置在urlloader.content内
使用 BitmapData 类的 getPixel( ) , setPixel( ) , getPixel32( ) , 和 setPixel32( ) 方法可以改变像素的颜色
其中带32的包括了透明度的修改
_bitmap.fillRect(new Rectangle(25, 25, 50, 50), 0xffff0000); 用于填充矩形
copyPixels( ) 方法的实现也很简单,只要得到象素值然后画到其他地方,非常类似于 draw( ) 方 法 。
但是 copyPixels( ) 可控制拷贝象素的数量和目标。只要指定一个矩形区域和目标点即可:
Bitmapdata.copyPixels(sourceBmp, srcRect, destPoint);
copyChannel( ) 方法是另一个在两个位图之间交换数据的方法。它的前三个参数和 copyPixels( )
方法一样,另外还有源通道和目标通道:
bitmap.copyChannel(sourceBmp, srcRect, destPoint,
srcChannel, destChannel);
直接通过 BitmapData 调用 noise( ) 方法,参数有:
bitmap.noise(seed, low, high, channel, grayscale);
用于生成随机噪波图案
使用 BitmapData 类的 perlinNoise( ) 方法 产生特别的混合图,可以使用随机数生成多彩的效果
使用 BitmapData 类的 threshold( ) 方法,使用在像素级的比较
我要在 BitmapData 上加上滤镜效果使用 BitmapData 类的 applyFilter( ) 方法
设置文本框的 restrict 属性用于设置文本过滤
包括些特殊字符 \t 表示制表符, \n 表示换新行都可以用。
设置 condenseWhite 属性为 true用于压缩空格,只对htmlText有效
使用 autoSize 属性用于表示文本框自动适应,可用值为RIGHT,LEFT,CENTER
控制文本栏滚动条
使用 scrollV, maxScrollV, bottomScrollV, scrollH , 和 maxScrollH 属性和设置鼠标滚轮相关的WheelEnabled 属性
创建 TextFormat 对象的 setTextFormat( ) 方法对部分文本进行格式化
使用 Stage.focus 属性可在程序里赋值焦点到一个文本框上
使用 TextField.setSelection( ) 方法 ,设置文件的部分选中效果
通过 TextField.setSelection( ) 设置文本框的光标位置,只要指定两个参数为同一个值即可,看下面的例子,记得首先要让文本框获得焦点: 用于将光标移动到指定的位置
(field.caretIndex); 用于输入当前光标所在位置
利用 HTML <a href> 标签设置文本框的 htmlText 属性,可以用于添加超链接,记得设置field.html = true;target='blank同HTML
var css:StyleSheet = new StyleSheet( );
css.parseCSS("a {color: #0000FF;} a:hover {text-decoration: underline;}");
field.styleSheet = css;
用于指定样式
监听 TextE vent .LINK 事件,可以捕获到用户点击了超链接
TextField 类也定义了一个属性和方法获取多行文本的信息。 numLines 属性表示文本框所包含的
文本行数, getLineIndexAtPoint( ) 方法返回当前坐标所在的行数, getLineIndexOfChar( ) 返回指
定字符所在的行数, getLineLength( ) 方法返回指定行所包含的字符数, getLineText( ) 方法返回 指
定行所包含的文本, getLineOffset( ) 方法返回指定行第一个字符的位置, getLineMetrics( ) 方法 关
于指定行数的 flash.text.TextLineMetrics 对象。 TextLineMetrics 类定义了该行文本的上位,下位,
高度,宽度等等信息。
对文字进行抗锯齿设置
对于嵌入字体可通过设置文本框的 antiAliasType 属性为 flash.text.AntiAliasType.ADVANCED ,然 后
设置 gridTypeFit 和 sharpness 属性 ;
默认下文本以正常抗锯齿设置显示,对于字体大小大于10,表现正常,但是对于小于 10 的字体正常抗锯齿就能难表现出好效果了,这时我们可通过文本框的 anti-aliasype 设为 advanced 并且使用 gridFitType 和 sharpness 属性进行精确控制。
替换文字
使用 replaceSelectedText( ) 方法替换选中的文字或用 replaceText( ) 方法替换某一范围的文字
获取系统字体列表
使用 TextField.fontList 静态属性
每 个 可 视 化 对 象 都 有 一 个 transform.colorTransform 属 性 , colorTransform 属 性 是 一 个
flash.geom.ColorTransform 对象实例,它决定对象的颜色。 colorTransform 属性总是返回
ColorTransform 对象的一个拷贝,也就说不能直接改变 colorTransform 属性,而是要先获取
colorTransform 属性,修改,然后再重新赋值给 colorTransform 属性,
var color:ColorTransform = sampleSprite.transform.colorTransform;
color.rgb = 0xFFFFFF;
sampleSprite.transform.colorTransform = color;
multiplier 属性 ( redMultiplier, greenMultiplier, blueMultiplier , 和 alphaMultiplier ) 范围都在 0 到 1 。
multiplier 值决定原始像素颜色的倍增值,默认值 1 ,表示增强 1 倍。下面的例子中绿色被增强 1
其他用法和上面一样
要恢复原来颜色
使用新建一个 ColorTransform 对象赋值给可视化对象的 transform.colorTransform 属性
用默认值创建一个 Matrix 对象,其中的 b 和 c 属性控制 Y 方向和 X 方向的倾斜,然后把 Matrix 对象
赋值给可视化对象的 transform.matrix 属性
该对象用于控制缩放
box.transform.matrix = new Matrix(1, 1, 0, 1, 0, 0);
第1个参数和第4个参数为 x轴和Y轴的高度 1表示原比例
第二个参数上下的倾斜角度 第三个表示左右的倾斜角度 0为默认值表示不倾斜
最后两个参数表示修改后组件x,y坐标
可以用于较复杂的动画效果,不过文字可能会消失,需要嵌入字体
应用简单的滤镜
使用组件的filter属性可以用于设置一个滤镜数组,添加一部分的滤镜效果
对滤镜对象的修改并不会马上影响到已经设置过filter属性,需要重新赋值一次才可以,而且读取filters属性时候,
放回滤镜数组的拷贝,并不能直接对对象的filters属性进行操作修改
总结下:操作的是对应的数组,需要重新赋值回去才可以进行修改
要清除的时候,只要赋值给[]空对象即可,或者使用null
knockout 属性用于隐藏原始图形,例如,设置阴影滤镜的 knockout 属性后显示出来只有阴影本
身,这一点非常有用,这样我们就能产生不叠加的滤镜组合了。
使用高级的滤镜
使用 ConvolutionFilter 对象
该类的构造函数的第一个参数表示 第三个参数的的列数, 第二个参数表示第三个参数的行数
sampleSprite.filteres = [ConvolutionFilter(3, 3, [0, 0, 0, 0, 1, 0, 0, 0, 0])];
所有以1为中心,周围是0的表示无效果,第四个参数用于消除亮度的问题
全部赋值用提高模糊度,记得同时修改第四个参数用于调整亮度
用浮雕矩阵创建联合矩阵,可以出去第四个参数(除数)
sampleSprite.filters = [new ConvolutionFilter(3, 3, [-2, -1, 0, -1, 1, 1, 0, 1, 2])];
使用边检测矩阵创建联合滤镜效果
sampleSprite.filters = [new ConvolutionFilter(3, 3, [0, 1, 0, 1, -3, 1, 0, 1, 0])];
中心数越大,检测到的边越少
应用锐化效果
锐化矩阵和边检测矩阵很类似,只不过边检测矩阵中心是个负数,而锐化矩阵中心是正数,中
心周围是负数,下面的例子应用了锐化效果:
sampleSprite.filter = [new ConvolutionFilter(3, 3, [0, -1, 0, -1, 5, -1, 0, -1, 0])];
提高中心值和除数降低锐化效果
降低中心值和除数提高锐化效果:
制作胶片效果----(反色) 使用ColorMatrixFilter
下面的例子应用了胶片效果:
sampleSprite.filters = [new ColorMatrixFilter([-1, 0, 0, 0, 255, 0, -1, 0, 0, 255, 0, 0, -1, 0, 255, 0, 0, 0, 1,
0])];
应用灰度效果--------把所有颜色变成黑白色
使用灰度矩阵创建 ColorMatrixFilter 对象
下面的例子应用了灰度效果:
sampleSprite.filters = [new ColorMatrixFilter([0.3086, 0.6094, 0.0820, 0, 0, 0.3086, 0.6094, 0.0820, 0,
0, 0.3086, 0.6094, 0.0820, 0, 0, 0, 0, 0, 1, 0])];
改变饱和度
使用饱和度矩阵创建 ColorMatrixFilter 对象
需要涉及到公式计算
改变对象的亮度
使用矩阵创建 ColorMatrixFilter 对象,也可用 ConvolutionFilter 对象改变亮度
下面的例子通过增加两倍的颜色来增强亮度:
sampleSprite.filters = [new ColorMatrixFilter([2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0])];
改变对比度 5x4的矩阵
使用对比度矩阵创建 ColorMatrixFilter 对象
动画编程..而不是简单的效果
速率和速度不是同一个概念,速率还包含方向因素,比如说: "10 米每小时 " 是速度,但是 "1 0
米每小时正北方向 " 是速率。在 x 或 y 轴上肯定是考虑方向的,一个正的速率代表 x 轴的右边,负
的为左边。
我想让物体以一定的速度在指定的方向上移动
转换速度和角度为 x 和 y 速率,进而改变对象的 x 和 y 轴位置
这个时候我们可利用基本的数学知识把角度和速度转换为 x 和 y 速率。首先,我们要确定角度,
如果需要弧度,需要下面的公式转换:
radians = degrees * Math.PI / 180;
如果需要度数,这用这个公式:
degrees = radians * 180 / Math.PI;
得到弧度后,即可用 Math.sin 和 Math.cos 函数结合速度算出 x 和 y 速率了:
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;
angle表示弧度,speed表示速度,进行位置变更的时候,需要同时调整x,y的位置
减速运动---物体平滑的移动到指定的位置,慢慢减速
使用抛物线公式
目标位置保存在 _targetX 和 _targetY 变量.每次移动比例保存在 _easingSpeed 变量中,这里设置为 0.1,表示总距离的1/10
关键的移动代码:
var vx:Number = (_targetX - _sprite.x) * _easingSpeed;
var vy:Number = (_targetY - _sprite.y) * _easingSpeed;
_sprite.x += vx;
_sprite.y += vy;
可以使用MouseX和Y来代替_targetX,来实现动态的变更位置
加速运动
应用加速方法 速率的变化称为加速
关键在于移动位置的同时,增加每次移动的距离(速度)
弹跳效果
使用 Hooke's 定律 --- 弹簧算法
Hooke's 定律描述了弹簧的运动规律,一般弹簧都有不同的弹力即弹簧所拥有的能量,或大或 小 ,
我们用 _k 变量表示弹簧能量的大小,设为 0.1 或 0.2 较好。
设置能量属性为 0.95 表示每次弹跳丢失 5% 的能量,
var ax:Number = (_targetX - _sprite.x) * _k;
var ay:Number = (_targetY - _sprite.y) * _k;
_vx += ax;
_vy += ay;
_sprite.x += _vx;
_sprite.y += _vy;
_vx *= _damp;
_vy *= _damp;
高级动画,如旋转,循环运动或摆动
使用内建的函数: Math.sin( ) , Math.cos( ) ,和 Math.atan2( ).
字符串等操作:
空格放在前面,后面的数字都会被转换成字符串
' "" ' 和" '' "的效果相同 也可以使用\进行转义
每次只读取一个字符
在 for 语句中使用 String.charAt( ) 方法,也可以用 String.split( ) 方法,以空字符串作为分隔符把所
有的字符分离出来作为数组,然后再用 for 语句遍历数组。
split更方便操作一些
StringUtil.trim()用于去除空格
使用 String.charCodeAt( ) 和 String.fromCharCode( ) 方法得到字符的 Unicode 码或 ASCII 码。
日期的使用
ActionScript 自动把日期转换为毫秒值,要获取这个值需要调用 Date 对象的 time 属性:
时间控件Timer有2个参数的构造函数,第一个是间隔时间,第二个是重复次数,默认为0,表示无限
会触发个 flash.event.TimerEvent中的Timer事件, 注意需要调用.start()方法开始播放
字符串转换成时间,使用 DateFormat 对象的 parse( ) 方法
声音编程
这些类都在 flash.media 包中,因此在写例子之前别忘了先引入 flash.media.Sound 包。
Var _sound :Sound = new Sound( );
soundFile = new URLRequest("song.mp3");
_sound.load(soundFile);
用于加载声音文件
调用play()方法开始播放
通过 SoundLoaderContext 类设置缓冲时间,默认缓冲事件为1秒
var request:URLRequest = new URLRequest("song.mp3");
var buffer:SoundLoaderContext = new SoundLoaderContext(5000);
_sound = new Sound(request, buffer);
_sound.play( );
play方法第一个参数设置开始播放时间,以毫秒为单位
第二个参数设置重复播放的次数
通过 Sound 对象的 bytesTotal 和 bytesLoaded 属性 可以获取到文件的大小
_sound.addEventListener(Event.ID3, onID3);用于监听ID3即mp3信息下载情况
下面代码用于监听音频播放完成
private var _channel:SoundChannel;
_channel = _sound.play( );
_channel.addEventListener(Event.SOUND_COMPLETE,function)
跟踪播放进度
使用 Sound.length 得到歌曲的总长度, SoundChannel.position 得到当前的播放位置
其中length属性并不确定,需要文件下载完成后,才会进行最后的确认
.close()方法会停止声音文件的所有处理,需要重新调用load();
还好, SoundChannel 类提供了一个 stop( ) 方法,它可以让音乐暂停而不影响声音流中断,要想 重
新播放 , 调用 play( ) 方法即可。
其中play参数可以传入 SoundChannel 类的 position 属性,用于从指定位置开始播放
获取声音的音量
通过 SoundChannel.leftPeak 和 SoundChannel.rightPeak 属性可以获取到只读的音量, 0到1
具体的控制是通过 SoundTransorm 对象
使用 SoundMixer 的 stopAll ( ) 方法 用于关闭所有的声音,静态方法
使用 SoundMixer.computeSpectrum( ) 填充一个字节数组,读取这个数组得到具体数据。
ByteArray 再作为 SoundMixer.computeSpectrum( ) 方法的参数,这个方法获得声音的快照并计算 出
左右声道的波形,每个通道取 256 个值,范围在 -1.0 到 1.0 。再把数据存到 ByteArray 中。
数据是准备好了,我们该怎么使用呢,我们需要循环遍历 ByteArray 512 次,调用 getFloat( ) 方法 ,
前面 256 个值代表左声道,后 256 为右声道。
改变声音的音量和平衡度
创建 SoundTransform 对象,改变音量及平衡度,把该对象赋值给 SoundChannel 对象的
soundTransform 属性。
var transform:SoundTransform = new SoundTransform( );
transform.volume = .5;
channel.soundTransform = transform;
其中可以用构造函数出入预定音量和平衡度
视频播放部分
var videoConnection:NetConnection = new NetConnection( );
videoConnection.connect(null);
一旦创建了 NetConnection 对象并调用了 connect( ) 方法,再构造 NetStream 对象,把 NetConnectio n
对象引用传给 NetStream 构造器作为参数。下面的代码构造了个 NetStream 对象 ( 先引入 imported
flash.net.NetStream ) :
var videoStream:NetStream = new NetStream(videoConnection);
注意这里可以使用connect(null); 来方便建立连接,而不马上确认真实的地址
var video:Video = new Video( );
addChild(video);
接着调用 Video 对象的 attachNetStream( ) 方法,和 NetStream 对象关联起来:
video.attachNetStream(videoStream);
下面的代码表示载入并播放名为 example.flv 的视频:
videoStream.play("example.flv");
如果 .flv 文件和 swf 文件在同一个域里, play( ) 调用不会被 Flash Player 安全机制拒绝,但是如果 在
不同的域时就需要一个安全策略文件。
使用 NetStream 对象的 soundTransform 属性,可以用于控制音量
flv 文件可以包含元数据,大多数视频编码器都包含长度元数据,单位为秒,我们可通过
ActionScript 读取它。
方式比较特别一些
把函数引用赋值给 NetStream 对象的 onMetaData 属性上
var client:Object = new Object( );
client.onMetaData = onMetaData;
_stream.client = client;
private function onMetaData(data:Object):void {
_duration = data.duration;
}
videoStream.seek(5); 用于在指定地方开始播放
改变视频的尺寸
设置 Video 对象的 width 和 height 属性,如果要根据视频编码时的尺寸播放,可使用 videoWidth 和videoHeight 值
需要注意的是, flv 还没下载之前这两个属性是不可用的,因此必须等两个属性可用,通过监听netStatus事件
管理缓冲和查看下载进度
使用 bufferTime 属性设置缓冲区大小,使用 bytesLoaded 和 bytesTotal 来监视下载进度
默认情况下视频只缓冲0.1秒,可通过NetStream的buffTime属性进行设置,单位是秒
监听flv格式原有的提示点
使用 onCuePoint( ) 回调函数
使用的具体方式和onMetaData( )一样
var client:Object = new Object( );
client.onCuePoint = onCuePoint;
videoStream.client = client;
Then define the method appropriately:
private function onCuePoint(cuePoint:Object):void {
trace(cuePoint.name + " " + cuePoint.time);
}
给视频添加滤镜,把过滤数组赋值给Video对象的filter属性
控制视频的播放和暂停
使用 NetStream 对象的 pause( ) 方法
其中该方法可以接受一个boolean参数,用于判断当前状态,进行不同的处理
true表示,如果暂停,则继续播放. false表示如果播放,就暂停, 其他无效果
如果要停止播放视频,需要使用NetStream类的close方法
如果要想每次都是播放最新的数据,可以在 url 上加个唯一字符串,如下面的代码:
videoStream.play("video.flv?uniqueIndex=" + (new Date( )).getTime( ));
视频播放完后,使用下面方法清理最后一帧的画面
video.clear( );
检查用于带宽--使用下载一个文件,然后计算时间来计算出下载的速度
本地化存储数据---SharedObject
Flash 的 LSOs 就如同 Web 浏览器中的 cookies
创建或打开共享对象
var example:SharedObject = SharedObject.getLocal( "example" );
写入数据到LSO上
example.data.exampleArray = new Array( "a", "b", "c" );
其中exampleArray为以后访问使用的key,不能存储可视化对象
保存lso到客户机
使用 SharedObject.flush( ) 方法,该方法返回一个字符串,用于判断是否保存成功
如果确切知道存储数据的大小,可直接给 flush( ) 传参数:
从共享对象中读取数据
就是读取共享对象的data属性中的值
trace( example.data.exampleProperty );
删除共享对象中保存的数据
使用 delete 删除共享对象的 data 属性中的值,或使用 clear( ) 方法清除整个共享对象
不能直接设置成null或者undefined,因为他们都是有效的值
delete example.data.someVariable;
序列化自定义类
使用 flash.net.registerClassAlias( ) 方法保留类型信息并把类实例添加到共享对象的 data 属性上。
LSOs 使用特殊的二进制格式, Action Message Format (AMF)
registerClassAlias( ) 方法需要两个参数,第一个参数表示类的别名,可以用任意字符串表示别 名 ,
比如 modal 包中有个 Person 类,别名可以是 modal.Person ,第二个参数类引用。
registerClassAlias( "somePackage.ExampleClass", ExampleClass );
这里需要注意的是 registerClassAlias( ) 必须在 SharedObject.getLocal( ) 方法之前调用才有效。否 则
的话共享对象会把 Person 解释为普通的 object 类型进行存储。
本地路径参数( getLocal( ) 第二个参数)为绝对或相对路径字符串,指定 LSO 的存储位置,例 如 :
var example:SharedObject = SharedObject.getLocal( "example", "/" );
这个目录的不同点是缺少电影剪辑的信息,这样创建的 LSO 可以被同一个域的其他 flash 电影所共享访问:
var example:SharedObject = SharedObject.getLocal( "example", "/" );
控制lso容量的大小
使用 Security.showSettings( ) 方法或者访问 Web 站点的 Flash Player Settings Manager.
通过 LocalConnection 实现互Flash之间的相互通信
让同一台电脑上的两个flash进行通信
创建本地连接
使用 flash.net 包中的 LocalConnection 类来收发数据。在接收端使用 LocalConnection.connect( ) 方 法
监听信息,定义一个函数触发 LocalConnection.send( ) 发送数据,两个 Flash 必须指定相同通信信道。
而不必当心flash是从什么服务器上下载来的
多个 Flash 要想进行通信必须做三件事:
1. 设置接收端 Flash 的监听处理函数
2. 告诉接收端收到数据后做什么
3. 从发送端 Flash 发送数据给接收端
var receiver:LocalConnection = new LocalConnection( );
// 通知本地连接实例监听来自于 " _exampleChannel " 通道的信息
receiver.connect( "_exampleChannel" );
正如上面的代码例子那样,最好取一个以下划线开头的通信信道名称,这样 Flash 播放器不会 加
入域信息 ,如 果不 是以 下划 线开 头, 则通 信信 道名 称字 符串 将被 自动 转换成
domain:connectionName ,而不管是本地域还是远程域。
连接的方法
1. 创建动态的 LocalConnection 子类,使用这个实例作为所有接收端本地连接
2. 创建 LocalConnection 子类重写发送数据的方法
3. 重定向客户对象的请求
三种不同的方法,下面进行每种的测试
1:
要想在运行时修改类的方法,该类必须申明为 dynamic 。在 ActionScript3.0 中最简单的方法就是
继承 LocalConnection 类并申明为 dynamic 类,使用这个类作为接收端:
dynamic public class DynamicLocalConnection extends LocalConnection {}
这样就可以直接使用该实例,灵活性很高,不过无法定义接口,不符合面向对象设计原则
2:
继承LocalConnection,将example方法写在类的内部.
3:使用LocalConnection的属性client来重定向请求,client对象必须是public的方法
_localConnection = new LocalConnection( );
_localConnection.connect( "_exampleChannel" );
_localConnection.client = this;
同时在这个类内部写出public的example()方法
发送信息的方式,后面可以带不定量的参数
var sender:LocalConnection = new LocalConnection( );
sender.send( "_exampleChannel", "example" );
如果试图connect一个已经被监听的端口,就会发生异常,所以需要进行try catch监听,通信的过程是多对一的
基于本地通信的有效性验证---即确认数据是否被接收端接受到
就是分别建立一个通道,然后在接受到数据的方法内部,再发送一次数据回去,比较好的设计可以把自己的通道名和方法发送给接收端..
接受来自其他域中的flash的本地连接请求
默认情况下,接收端只接受来自同一个域的本地连接请求,不过可以使用allowDomain()方法允许或者禁止来自其他域的请求连接
使用LocalConnection实例来进行设置
receiver.allowDomain( "macromedia.com", "adobe.com", "google.com" );
~ 表示所有的域都允许, localhost 表示只有本机的允许。
还有个与 allowDomain( ) 类似的方法 allowInsecureDomain( ) 方法,用于设置Https的请求
在 ActionScript 3.0 里发送和读取的数据都会被改变。 LoadVars 类已经被 flash.net 的 URLLoader 所 代
替。 URLLoader 支持新的字符集映射,他们是 URLRequest , URLVariables , 和 URLStream 。这
些类提供了比以前更强大更灵活的处理能力。
读取 URL- 编码数据时应该使用 URLLoader.load( ) 方法
load( ) 方法需要一个 URLRequest 实例作为参数,该参数指向文本文件的 URL
如果读取成功, Flash 播放器把数据存在 URLLoader 实例的 data 属性上,并发出complete事件
// 设置读取的是 URL- 编码 变量 --就是key和value的键值对格式
loader.dataFormat = DataFormat.VARIABLES;
如果事先不知道变量名可以使用for in
for ( var property property property :String in loader.data ) {
// property 就是 data 里的变量名
trace( property + " = " + loader.data[property] );
}
读取文本块(包括了HTML和XML)
使用 URLLoader.load( ) 和 DataFormat.TEXT
dataFormat 属性如果为 DataFormat.TEXT ,则会把数据解释为普通的文本内容,默认就是这个
var loader:URLLoader = URLLoader( event.target );
方式进行事件完成对象的包转,可以减少全局变量的好似用,然后访问实例的data对象
如果设置为 DataFormat.BINARY ,则 data 的数据类型为 flash.util.ByteArray 。
监听加载进度
使用loader.addEventListener( ProgressEvent.PROGRESS, handleProgress ); 事件类型为ProgressEvent
注意UrlLoder不能边下载,边处理数据,那需要使用到URLStream
URLStream 中的 progress 事件允许使用 bytesAvailable 属性和下列方法如 readInt( ) , readByte( ) ,
readBoolean( ) 检查下载的数据。访问的是二进制数据
同样使用相同的模式进行数据的边加载 边处理
var streamer:URLStream = URLStream( event.target );
// 遍历所有已读取得字节数据
while ( streamer.bytesAvailable > 0 ) {
// Read a byte value and output it to the console window
trace( "Read byte: " + streamer.readByte( ) );
}
读之前最好检测下 bytesAvailable 属性,防止越界
简单的发送数据给服务端脚本
创建一个包含数据的 URLRequest 实例,并用 flash.net.sendToURL( ) 方法传递给服务端脚本 , 如果 想
在新的浏览器窗口中打开可使用 flash.net.navigateToURL( ) 方法,如果想知道执行结果,可使用
URLLoader.load( ) 方法。
sendToURL( ) 方法也就不会返回数据是否发送到.
navigateToURL( request, "_blank" ); 可以用于在新窗口中发送数据
如果想接收服务器返回的结果,可使用 URLLoader.load( ) 方法
默认情况下使用sendToURL()或navigateToUrl()方法,数据都是通过HTTP POST方法传输的
创建发送的变量的方式
var variables:URLVariables = new URLVariables( );
variables.someText = "Post me!";
request.data = variables;
下面是用于指定发送的方式
request.method = URLRequestMethod.POST;
使用loader.load(request)来发送请求
xml使用
创建XML对象,使用As内置的xml类型
直接声明
var example:XML = <abc><a>eh</a><b>bee</b><c>see</c></abc>;
也可以直接将字符串转换成XML
var example:XML = new XML( str );
添加xml元素
使用 E4X 语法创建子元素并添加到 XML 树中。另外用 insertChildBefore( ) 和 insertChildAfter( ) 方法更容易控制元素的添加。
var example:XML = <example />;
example.newElement = <newElement />;
那样就可以显示如下效果
<example>
<newElement/>
</example>
也可以直接添加一个节点
var example:XML = <example />;
example.emptyElement = "";
/* 显示 :
<example>
<emptyElement/>
</example>
*/
也可以使用数组的方式进行添加
var example:XML = <example />;
var id:int = 10;
example[ "user" + id ] = "";
/* 显示 :
<example>
<user10/>
</example>
*/
有可能包含特殊符号的时候会报错,那时候就要使用[]方式来添加
需要注意,这种方式添加的节点都是放置xml树的尾部,可以用insertChildBefore( ) 和 insertChildAfter( ) 方法来控制插入的位置。 insertChildBefore( ) 方法在当 前元素位置前插入新元素,而 insertChildAfter( ) 在当前元素的后面插入,看下面的例子:
example = example.insertChildBefore( example.two, <one /> );
表示在example实例的<two>节点前介入<one>节点
注意这两个方法不会修改原先的xml,只会返回新的xml
添加文字节点
即可使用 E4X 语法创建文本节点并插入到 XML 树中,也可用 appendChild( ) , prependChild( ) ,
insertChildAfter( ) , 和 insertChildBefore( ) 方法进行更多控制,灵活插入。
// 创建 XML 实例
var example:XML = <example/>;
example.firstname = "Darron";
example.number = 24.9;
example.boolean = true;
example.abc = ["a", undefined, "b", "c", null, 7, false];
/* 显示 :
<example>
<firstname>Darron</firstname>
<number>24.9</number>
<boolean>true</boolean>
<abc>a,,b,c,,7,false</abc>
</example>
这样会同时增加文本和元素节点
在xml中添加属性,使用@属性名进行操作,其他等同于增加元素节点
elementNode.@attributeName = "value";
读取xml树中的元素
使用 elements( ) 方法返回 XMLList 类型的所有元素,并用 for each 循环遍历
for each ( var element:XML in node.elements( ) ) {
{trace( element.@label );}
通过名字查找元素节点
就是通过节点的实例名.节点名.@属性名就可以进行所有的查询
可以用..来跳过一级访问
多个同类型节点的时候,使用类似数组的方式访问,下标有0开始
当节点同时包了节点也包含了文本,可以使用.text()方法输出文本内容
读取元素的属性
使用 attributes( ) 方法返回指定元素的属性列表,返回一个xmlList类型,使用数组的方式进行访问
使用.name()方法可以显示属性名
trace( fruit.attributes( )[1].name( ) );
还有种方法,可使用 attribute( ) 方法并传入属性名作为参数,得到属性值:
trace( fruit.attribute("color") );
用 (*) 和 @ 操作符可访问所有属性值,有些类似于 attributes( ) 方法:
trace( fruit.@*[0] );
trace( fruit.@*.length( ) ); 用于判断节点下属性的数量
如果属性有包含特殊字符,可以使用[]进行访问,其中可以用于组合条件进行查询
trace( example.@["color" + num] );
删除节点,文本和属性
使用delete关键字
delete example.fruit.@color; 删除属性
delete example.vegetable.text( )[0] 删除文本节点
delete example.dairy; 删除属性
载入xml
使用 URLLoader.load( ) 方法且设置 dataFormat 属性为 DataFormat.TEXT 读取数据,通过 complete事件处理函数转换载入的数据为 XML 实例
下面代码用于在事件中加载返回结果
var example:XML = new XML( event.target.data );
最好使用异常进行包装
从不同域中加载xml文件,需要设置crossdomain.xml策略文件,允许可访问的远程域,也许只是.xml扩展的文件
发送xml
通过 URLRequest 实例把 XML 数据包装起来,用 flash.net.sendToURL( ) 发送数据并忽略服务器的
响应,用 flash.net.navigateToURL( ) 发送数据并把服务器的响应显示在指定窗口,或者用
URLLoader.load( ) 发送数据并处理服务器响应。
远程过程调用 (RPC) ,
URLRequest 对象的 contentType 属性默认设置为 application/x-www-form-urlencoded ,当发送
XML 数据时必须设置为 text/xml ,而且设置 method 属性为 URLRequestMethod.POST ,表示 通
过 HTTP POST. 发送数据。
搜索xml,根据某种规则搜索出xml对象的节点和属性
返回所有对应的节点集合
var fruitList:XMLList = foodgroup.fruits.fruit;
比较常见的格式
trace( fruits.fruit.(name == "Apple").@color );
也可以使用正则表达式进行比较
trace( fruits.fruit.( /^[aeiouAEIOU].*/.test( name ) ) );
()内用于进行筛选的条件
在xml中使用html和特殊字符
使用CDATA标签
<example><![CDATA[a < b]]></example>
当时不能同时包含]]>
远程过程调用 (RPCs) 是一种建立分布式应用程序技术,
不过有两种方式最普遍: web services 和 Flash Remoting 。
Flash Remoting 通过 HTTP 通讯,不过采用的协议不是 SOAP ,而是一种二进制数据协议,称 之
为 Active Messaging Format (AMF) 。因为 AMF 数据报是二进制的,这样可以传输更多的数 据 ,
效率更高,因此 Flash Remoting 速度要比其他 web services 快。
处理WebService,需要先加载wsdl文件,设置wsdl文件后 调用loadWSDL()方法
处理WebService的返回结果
webService.getAverages.addEventListener(ResultEvent.RESULT, onGetAverages);
其中getAverages是WebService中的方法名
监听WebService发出的异常
webService.addEventListener(FaultEvent.FAULT, onWebServiceFault);
事件类型为mx.rpc.Fault.Fault
与JavaScript通信
使用ActionScript调用JavaScript
使用 ExternalInterface.call( ) 函数,至少需要一个参数表示函数名,后面其他参数表示JavaScript的参数
var title:String = ExternalInterface.call("getTitle");
也可以使用flash.net.navigateToURL( ) 函数。
var request:URLRequest = new URLRequest("javascript:alert('example');");
navigateToURL(request);
不过这个方法本身不提供返回值
JavaScript调用ActionScript.
使用 ExternalInterface.addCallback( ) 注册 ActionScript 函数,然后在 JavaScript 端进行调用
addCallback( ) 方法接收两个参数:第一个参数为 String类型的函数名,浏览器将借此名称得知要调用的函数,第二参数为浏览器调用定义的函数名时要执行的实际 ActionScript 函数。
ExternalInterface.addCallback("showMessage", displayMessage);
在 JavaScript 端需要得到 Flash 播放器对象引用
ActiveX 版本播放器由 HTML 页中的 <object> 标签控制,flash的引用通过window.id 其中id是Object标签的id
plug-in 版本播放器由 HTML 页中的 <embed> 标签控制,flash的引用通过window.document.id 其中id是Embed的标签
可以通过navigator.appName来判断用户浏览器的类型,方便于选择合适的引用
然后通过 flashPlayer 变量来调用注册的 ActionScript 函数
flashPlayer.showMessage( ); ,也可以用于传递参数,关键在于ActionScript中function定义的参数列表
将Html中的变量传递给SWF,可以使用flashVars
在Object标签中,使用 <param name="FlashVars">标签,定义键值对格式字符串
url1=http://www.example.com&url2=http://www.sample.com
在ActionScript中可以使用root.loaderInfo.parameters来获取其中的值,
文件的上传下载部分,使用FileReference 和 FileReferenceList 类,以及浏览本地文件
var fileReference:FileReference = new FileReference( );
var urlRequest:URLRequest = new URLRequest("example.txt");
fileReference.download(urlRequest);
用于下载指定URL下的文件,也可以使用绝对路径,download方法的第二个参数用于设置下载的默认文件名,
且最好放置在try..catch中
fileReference.addEventListener(Event.SELECT, onSelectFile); 用于监听用户是否开始下载
fileReference.addEventListener(Event.CANCEL, onCancelDialog);用于监听用户是否取消下载
fileReference.addEventListener(ProgressEvent.PROGRESS, onFileProgress);用于监听下载进度
fileReference.addEventListener(Event.COMPLETE, onFileComplete);用于监听下载完成
浏览本地文件用于上传
使用 FileReference 或 FileReferenceList 对象的 browse( ) 方法
记得使用try--catch检测异常
过滤浏览对话框显示的文件
传递一个 FileFilter 对象数组 作为 browse( ) 方法参数
FileFilter 构造器至少需要两个参数:
第一个参数决定在下拉列表中显示什么文件类型:
第二个参数决定显示的文件扩展名。
var fileFilter:FileFilter = new FileFilter("Images", "*.png;*.gif;*.jpg");
fileReference.browse([fileFilter]);
监测用户是否选择了文件准备上传
fileReference.addEventListener(Event.SELECT, onSelectFile),用于监听用户选择了文件
选中后,文件的信息都保存在fileReference之上
selectedFileTextField.text = fileReference.name;
同样也可以通过监听Event.CANCEL来监测用户取消了上传
var urlRequest:URLRequest = new URLRequest("uploadScript.cgi");
fileReference.upload(urlRequest);
所有上传使用 POST 传输方式, Content-Type 为 multipart/form-data 。
如果是调用 FileReferenceList 对象,那根据 fileList 属性必须为每个文件调用一次 upload( ) 方法,
FileReferenceList 对象的 fileList 属性就是 FileReference 对象数组。
监听文件上传进度,可以使用Progress事件,
其中多文件上传,可以通过判断上传的文件数量,和当前文件上传的速度来做判读.
也可以通过计算全部文件的总大小和当前上传的数量进行汇总计算.
使用Socket进行连接
与其他的通信技术最大的不同是Socket连接在数据传输完成后不会自动关闭,因此服务器可以在任何时间主动发送数据给客户端
Flash下主要包括了二进制的Socket连接和XML Socket连接,其中后者使用xml格式传输数据.
这两种均使用了事件的方式读取数据
如 果 Socket 或 XMLSocket 对 象 要 使 用 cross-domain 策 略 文 件 , 可 通 过 方 法
flash.system.Security.loadPolicyFile( ) 读取:
Security.loadPolicyFile("http://www.rightactionscript.com/crossdomain.xml");
创建连接的例子
socket = new Socket( );
socket.addEventListener( Event.CONNECT, onConnect ); 监听是否连接成功
socket.connect( "localhost", 2900 ); 发起连接请求
cross-domain 策略文件例子:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-
policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" to-ports="80,110" />
</cross-domain-policy>
发送数据给Socket服务器
对于 Socket 对象,是使用 write 方法 ( writeByte( ) , writeUTFBytes( ) , 等等 ) 把数据写入到缓冲区,
再通过 flush( ) 方法发送数据,对于 XMLSocket 对象使用 send( ) 方法 。
writeUTF( ) 和 writeUTFBytes( ) 方法写入字符串,每个方法接受一个字符串参数, writeUTFBytes ( )
方法写入字节形式的字符串, writeUTF( ) 方法写入字节数字。
writeMultiByte( ) 方法也是写入字符串数据,但可以不使用默认字符集,该方法接受两个参数:
字符串和指定字符集编码,下面的例子写入 Unicode 编码的字符串:
socket.writeMultiByte("example", "unicode");
XMLSocket 类发送数据就比较简单了,发送数据的方法为 send( ) , send( ) 方法接受任意类型的数
据类型,它会把参数转换为字符串并发送给服务器,一般这个参数是一个 XML 对象:
注意:处理flex发送给Java服务端时,需要单独的加上+"\n"用于发送数据,防止读取的过程产生阻塞 不能在内容内加入\n
接受来自服务端的数据
对于 Socket 实例可通过 ProgressEvent.SOCKET_DATA 事件处理函数中读取数据,可用 readByte( )或 readInt( ) 方法
对于 XMLSocket 实例可通 data 事件处理函数中读取 XML 数据
socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );
然后在事件内部通过下面的代码进行字符串的读取
var string:String = socket.readUTFBytes(socket.bytesAvailable);
XmlList下面事件有点不同
xmlSocket.addEventListener( DataEvent.DATA, onData );
处理事件的函数中,使用如下进行处理接受的数据,数据存放在event.data中,事件类型为vent:DataEvent
var response:XML = new XML( event.data );
断开与Socket服务器的连接
调用 Socket.close( ) 或 XMLSocket.close( ) 方法关闭连接,或者监听 close 事件
监听事件主要用于判断是否已经断开,或者网络中断
socket.addEventListener( Event.CLOSE, onClose );
端口号不能高于 655535.
通过 socket 对象的 connected 属性是否为 true,判断是否已经连接服务器