`
friendsys
  • 浏览: 347308 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

ActionScript读书笔记

阅读更多
属性的作用在于直接访问的属性的方法来更新值,却可以同时增加方法进行验证

要发送事件.需要继承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,判断是否已经连接服务器














分享到:
评论

相关推荐

    ActionScript 3.0入门教程ppt

    - **深入阅读**:多读实体书,至少读三遍以巩固理解。 - **实践编程**:模仿示例,动手编写并调试代码,提升编程直觉。 - **做笔记**:记录学习过程中的关键点,加强记忆。 5. **与Java和C++的比较**: - **...

    ActionScript3.0高级动画教程

    ActionScript 3.0是Adobe Flash平台上用于创建交互式...通过阅读“高级教程ActionScript_3.pdf”,读者将能够深入理解并熟练运用ActionScript 3.0,无论是在专业项目中还是个人创意作品上,都能展现出更高的技术水平。

    AS3殿堂之路笔记

    总的来说,通过深入阅读和实践AS3殿堂之路笔记,你可以系统地学习AS3,从而在Flash平台上创建出功能丰富的交互式内容。无论你是初学者还是有一定经验的开发者,这份笔记都将是提升AS3技能的宝贵资源。

    ActionScript 3.0(study).rar

    “ActionScript 3.0(study).txt”这个文件很可能是学习资料或笔记,可能包含了关于以上知识点的详细解释、示例代码或学习指南。通过阅读和实践其中的内容,可以深入理解并掌握ActionScript 3.0的核心概念和技术,...

    AS3.0_AS3殿堂之路_笔记

    《AS3.0_AS3殿堂之路_笔记》是针对...通过深入阅读和实践这些笔记,学习者将能够熟练掌握AS3,踏上通往Flash开发殿堂之路。笔记中的关键知识点和实例将帮助初学者快速上手,并为有经验的开发者提供有价值的参考资料。

    flex3读书笔记----flex整合hibernate

    Flex 3 是该框架的一个版本,提供了丰富的组件库、数据绑定以及ActionScript 3.0支持,使得开发人员可以构建具有高度用户体验的前端应用。 2. **BlazeDS**: BlazeDS 是 Adobe 提供的一个开源项目,它允许 Flex ...

    殿堂之路_as3笔记

    【殿堂之路_as3笔记】是针对ActionScript 3(AS3)编程语言的一份详细学习资料,由小秋编撰。...通过阅读这份笔记,学习者可以对AS3有一个全面的认识,提高自己的编程技能,为创建动态、互动的Web内容打下坚实的基础。

    Flex学习笔记

    至于“Flex3权威指南学习笔记及相应代码”,这部分很可能是作者在阅读书籍并实践的过程中记录下的关键点和代码示例,可能包含了书中示例的实现,或者是作者自己根据书中的概念创建的实验项目。通过这些笔记和代码,...

    AS3笔记

    AS3,全称为ActionScript 3.0,是Adobe公司开发的一种...通过阅读《Youthoy的AS3笔记.doc》文档,你将获得更详细的实践经验和技巧。这个文档可能包含了示例代码、问题解答、最佳实践等内容,是你提升AS3技能的好帮手。

    FLEX学习笔记

    通过阅读“FLEX学习笔记”的博客文章,你可以期望找到更多关于这些概念的实际应用和开发者在学习过程中遇到的问题及解决方案。而解压并研究"MyDemo"项目,则能让你看到Flex项目的实际结构,帮助你在实践中学习和理解...

    Flex + Hessian 学习笔记(二)

    在本学习笔记中,我们将深入探讨这两者以及它们如何协同工作。 Flex是Adobe开发的一种开放源码的富互联网应用(RIA)框架,它基于ActionScript编程语言和Flash Player或Adobe AIR运行时。Flex允许开发者创建具有...

    flex学习笔记 flex学习总结 flex学习教程

    Flex是Adobe公司推出的一种用于构建富互联网应用程序(RIA)的技术,它基于ActionScript编程语言和Flex框架,可以创建交互性强、用户体验优秀的...通过阅读这些材料,你将能够逐步掌握Flex开发技术,踏上Flex开发之旅。

    Flex 开发学习笔记6.2 - 引用自定义的 Flex Library Project

    这个"Flex 开发学习笔记6.2 - 引用自定义的 Flex Library Project"着重讲解了如何创建和引用这样的库项目。让我们深入探讨这个主题。 首先,Flex Library Project是一种特殊的项目类型,它的目标是生成SWC(Adobe ...

    FLASH 学习资料

    为了深入学习Flash,除了阅读笔记,还需要实际操作练习。尝试创建简单的动画项目,例如动态横幅、交互式游戏或教学演示,将有助于巩固理论知识并提升动手能力。同时,了解Flash与HTML5 Canvas、WebGL等现代Web动画...

    Cairngorm学习笔记

    通过阅读《Cairngorm笔记.doc》文档,你可以更详细地了解每个组件的工作方式,以及如何在实践中应用这些概念。文档可能包含示例代码、最佳实践以及解决常见问题的技巧。学习和掌握Cairngorm框架,将有助于你构建高效...

    [转] 老板让俺总结的puremvc学习笔记

    在阅读《PureMVC学习笔记.docx》时,你可能会深入了解每个组件的工作原理,以及如何在实践中应用它们。这份文档可能包含了示例代码、最佳实践和常见问题解答,帮助你更好地理解和掌握PureMVC框架。通过学习和实践,...

    flex开发入门资料

    Flex开发是一种创建富互联网应用程序(RIA)的技术,它基于Adobe...记住,实践是检验理论的最好方式,所以在阅读资料的同时,一定要动手编写代码,不断尝试和调试,以加深理解和记忆。祝你在Flex开发的道路上越走越远!

Global site tag (gtag.js) - Google Analytics