function distanceBetweenPois (lng0 : Number, lat0 : Number, lng1 : Number, lat1 : Number) : Number
{
$nbsp$$nbsp$var lngDelta : Number = Math.abs (lng0 - lng1) / 180 * Math.PI;
$nbsp$$nbsp$var latDelta : Number = Math.abs (lat0 - lat1) / 180 * Math.PI;
$nbsp$$nbsp$return Math.round (Math.acos (Math.cos (lngDelta) * Math.cos (latDelta)) * _global.CONSTS.EARTH_RADIUS);
}
日志标签 ‘AS’
【AS】根据经纬度,计算地球表面的两点之间的距离
2007年4月13日AS2所有内置属性,类,方法,全局变量等等
2007年4月13日ALPHANUMERIC_FULL ALPHANUMERIC_HALF AND Accessibility Array AsBroadcaster BACKSPACE BevelFilter BitmapData BitmapFilter BlurFilter Boolean Button CAPSLOCK CASEINSENSITIVE CHINESE CONTROL Camera Color ColorMatrixFilter ColorTransform ContextMenu ContextMenuItem ConvolutionFilter CustomActions DELETEKEY DESCENDING DOWN Date DisplacementMapFilter DropShadowFilter E END ENTER ESCAPE Error ExternalInterface » 阅读更多: AS2所有内置属性,类,方法,全局变量等等
ActionScript3.0概要
2007年3月7日ActionScript3.0概要
ActionScript 3.0 演变成一门强大的面向对象的编程语言意味着flash平台的重大变革。这种变化也意味着 ActionScript 3.0 将创造性地将语言理想地迅速地建立出适应网络的丰富应用程序, 成为丰富网络应用(Rich Internet Application)项目的本质部分。比较早期的ActionScript版本就已经提供了这种要求为创造真实地参与在线体验的力量和灵活性。ActionScript 3.0 将促进和发展这种性能, 提供发展强大表现和舒适的先进的高度复杂应用, 结合大型数据库以及可移值性的面象对象的代码。拥有 ActionScript 3.0, 开发者可能达到高效执行效率和表现同一的平 台。
» 阅读更多: ActionScript3.0概要
事关Flash Player安全性-FlashPlayerTrust
2007年2月4日为了让你的Flash在用户硬盘中拥有同时访问网络和本地的能力,你必须在用户计算机的FlashPlayerTrust目录中为你的Flash添加权限。
FlashPlayerTrust 配置文件。这些是列出受信任路径的简单文本文件。这些文件由可执行的安装程序创建。当安装程序将 SWF 安装到用户的计算机时, 它能够安装信任的配置文件并指定 SWF 是受信任的。当该做法没有表现用户显式决定每个受信任的 SWF 时, 该用户已通过运行安装程序将信任隐式给予它, 毕竟它是可执行程序。Flash Player 可识别以下两个位置的信任配置文件: 影响计算机所有用户的位置和只影响当前用户的位置。所有用户位置需要操作系统级别的管理权限。这些位置如下:
-
Windows 所有用户:
<系统 › \Macromed\Flash\FlashPlayerTrust
MovieClipLoader深入研究
2006年10月12日【寻找白云】原创文章,转载请务必注明作者和出处。本文深入研究了MovieClipLoader类的特性,假定读者对此类有一定的了解,并可以使用该类进行简单的诸如loading的开发,但是本文并不是一篇介绍loading的文章。
使用moviecliploader下载过多的位图会带来计算机网络连接的拥塞,即使使用unloadClip方法取消下载,仍然不会有好转,引起这个现象的原因与这个类的实现细节有关系,我们虽然不能看到其实现的原理,但是通过它的表现,可以对其特性有所认识。
MovieClipLoader可以胜任一般的应用,但是对于一些大量的下载任务,如果使用不当,可能带来严重的网络负担和非常差的用户体验。下面分别讨论MovieClipLoader类的各个方法。
loadClip(MovieClipLoader.loadClip 方法)
public loadClip(url:String, target:Object) : Boolean
下文红色部分摘自Flash Professional 8 官方文档。
在播放原始影片时,将 SWF、JPEG、渐进式 JPEG、非动画 GIF 或 PNG 文件加载到 Flash Player 中的影片剪辑中。如果您加载 GIF 动画,仅显示第一帧。使用此方法可以一次显示多个 SWF 文件,并且无需加载另一个 HTML 文档即可在 SWF 文件间进行切换。
使用 loadClip() 方法代替 loadMovie() 或 MovieClip.loadMovie() 具有许多优点。通过使用侦听器对象来实现下列处理函数。通过使用 MovieClipLoader.addListener(listenerObject) 向 MovieClipLoader 类注册侦听器,可以激活该侦听器。
- 在加载开始时调用 MovieClipLoader.onLoadStart 处理函数。
- 在无法加载剪辑时调用 MovieClipLoader.onLoadError 处理函数。
- 在加载进程正进行时调用 MovieClipLoader.onLoadProgress 处理函数。
- 在文件完成下载但已加载的影片剪辑的方法和属性尚不可用时调用 MovieClipLoader.onLoadComplete 处理函数。在 onLoadInit 处理函数之前调用此处理函数。
- 在执行该剪辑的第一帧中的动作后调用 MovieClipLoader.onLoadInit 处理函数,以便您可以开始处理加载的剪辑。在 onLoadComplete 处理函数之后调用此处理函数。在大多数情况下,请使用 onLoadInit 处理函数。
加载到影片剪辑的 SWF 文件或图像会继承该影片剪辑的位置、旋转和缩放属性。可以用该影片剪辑的目标路径来定位加载的影片。
您可以使用 loadClip() 方法将一个或多个文件加载到单个影片剪辑或级别中;将 MovieClipLoader 侦听器对象作为参数传递给正加载的目标影片剪辑实例。或者,您可以为加载的每个文件创建不同的 MovieClipLoader 对象。
使用 MovieClipLoader.unloadClip() 可删除用此方法加载的影片或图像,或者取消正在进行中的加载操作。
首先需要指出的是,loadClip方法对于Flash编程人员来说是多线程的,不管其内部实现机制如何,一个事实可以证明这一点:我们可以使用loadClip方法同时下载多个图片,并把不同的图片放在不同或者相同的电影剪辑当中。(文档中仅仅指出可以放在同一个剪辑当中)。
第二点,MovieClipLoader.onLoadStart处理函数并不是调用loadClip后会立即触发。文档称,当被加载的剪辑或者图片的第一个字节被写入用户磁盘中时,此函数被调用。可以确定,当网络连接不可用或者被下载资源不可用的时候就可能用原不会触发此事件。
unloadClip(MovieClipLoader.unloadClip 方法)
public unloadClip(target:Object) : Boolean
下文红色部分摘自Flash Professional 8 官方文档。
删除通过使用 MovieClipLoader.loadClip() 加载的影片剪辑。如果您在正加载影片时发出此命令,则调用 MovieClipLoader.onLoadError。
可用性:ActionScript 1.0;Flash Player 7
参数
target:Object – 传递至对 my_mcl.loadClip() 的相应调用的字符串或整数。
返回
Boolean – 一个布尔值。如果删除影片剪辑成功,则返回 true;否则返回 false。
示例
下面的示例将图像加载到名为 image_mc 的影片剪辑中。如果单击影片剪辑,则会删除该影片剪辑,并且信息会显示在"输出"面板中。
this.createEmptyMovieClip("image_mc", this.getNextHighestDepth());
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
target_mc._x = 100;
target_mc._y = 100;
target_mc.onRelease = function() {
trace("Unloading clip...");
trace("\t name: "+target_mc._name);
trace("\t url: "+target_mc._ur$nbsp$$nbsp$;
image_mcl.unloadClip(target_mc);
};
};
var image_mcl:MovieClipLoader = new MovieClipLoader();
image_mcl.addListener(mclListener);
image_mcl.loadClip("http://www.helpexamples.com/flash/images/image1.jpg", image_mc);
此方法是我们讨论的核心所在。loadClip文档称:使用 MovieClipLoader.unloadClip() 可删除用此方法加载的影片或图像,或者取消正在进行中的加载操作。我们知道,loadClip方法是需要占用网络连接核内存资源的,我们寄希望于一旦调用unloadclip则立即释放网络连接和内存资源。但是事与愿违!这是MovieClipLoader方法的关键问题。当AS调用MovieClipLoader.unloadClip()之后,并不一定会马上释放资源。当我们使用MovieClipLoader下载大量的图片的时候,虽然我们在调用unloadClip之后才下载新的图片,但是网络连接的使用将进一步累积增大,导致网络连接的暂时阻塞。
经过测试,调用loadClip方法之后,立即调用unloadClip方法是丝毫不起作用的,下载过程会继续进行,并且MovieClipLoader类的事件处理函数仍然会被调用。这看起来非常出乎人的意料之外!而且非常不合理,但是事实就是如此。另外,如果手动将被加载对象的目的剪辑删除(unloadMovie或者removeMovieClip),这将删除舞台上的剪辑,但是仍然不能释放MovieClipLoader所占用的资源。
事实证明,当MovieClipLoader.onLoadComplete被调用之后,再次使用unloadClip方法,将会删除被加载的剪辑,但是同时网络连接的占用也会被释放。但是这样做的并没有太大的意义,因为因为图片一旦开始下载,资源消耗是不可消除的,但这卡恰又是关键的资源。这段无意义的资源占用会字节导致用户计算机的网络阻塞,表现为上网速度突然降低,几秒钟之后恢复正常(这要看用户的网络速度如何以及同时下载的图片数有多大)。
unloadClip的存在的另外一个问题是MovieClipLoader.onLoadError事件的触发问题。文档指出:如果您在正加载影片时发出此命令,则调用 MovieClipLoader.onLoadError。但是通过我的测试,不论何时调用了unloadClip方法,MovieClipLoader.onLoadError都不会被触发!这是另一个非常惊人的现象!
现在我还没有找到一个方法,可以彻底的从内存中删除一个对象。我们知道,as是使用垃圾收集机制来管理内存的,我们并不能直接调用垃圾收集动作,也就是说,大多数时候,我们设置一个对象的唯一引用为null,那么可以判断这个对象已经符合垃圾收集的条件,但是这个对象并不会立即被破坏,它所占用的内存和其他资源并不会立即被释放。因此,我们没有办法在所有时候立即释放MovieClipLoader所占用的资源。
onLoadInit(MovieClipLoader.onLoadInit 事件侦听器)
onLoadInit = function([target_mc:MovieClip]) {}
下文红色部分摘自Flash Professional 8 官方文档。
当执行加载的剪辑的第一帧上的动作时调用。在调用此侦听器后,您可以设置属性、使用方法,还可以与加载的影片交互。对通过使用 MovieClipLoader.addListener() 添加的侦听器对象调用此侦听器。
target_mc 的值标识作为这一调用的目标的影片剪辑。此参数在使用同一组侦听器加载多个文件时非常有用。
这里需要补充一点:onLoadInit是在调用被加载剪辑的第一帧的代码之后被触发。onLoadCompelete触发是在被加载对象的最后一个字节被写入用户磁盘的时候被调用,在此之后和onLoadInit之前,被加载对象的内部数据是不可用的。然而,这里的内部数据指的是被加载对象的帧代码以及其子剪辑,被加载对象本身的属性和方法是有效的!也就是说,将图片加载到mc中的过程中的任何时候,mc._x是始终可以被使用的。
最终结局:我使用sniffer观察IP数据包之后,发现多个MovieclipLoader会共用TCP:http网络连接,只要前一个任务下载完毕,就可以释放连接给下一个任务使用,这是MovieclipLoader实现中非常明智的地方。但是如果尚没有任务下载完毕,也就是没有空闲TCP:http网络连接,就会创建新连接,旧链接在任务完成或者其他很短的时间内被作废,通过观察发现,无论多少个MovieClipLoader同时下载多少个任务,并发使用中的网络连接数最多是10,但是已经开启却不再使用了的网络链接这可能很多。如果不断下载新图片并且在旧尚未下载完之前移除target_mc,由于无法立即释放这些被删除的图片所占用的TCP:http网络连接,那么会导致每添加一个新下载任务都会创建新连接,旧链接被作废。这样一来,无用的网络链接占用就会很多,导致网络阻塞。
重用网络连接的唯一方法:永远不要在onLoadCompelete完成之前删除一个被加载的图片;决定要下载一个新图片时要确定是否真的必须下载。
至此MovieclipLoader的关键问题就很明显了:MovieclipLoader类没有提供立即释放网络连接的方法,这是问题的根源。
附录:本文用户讨论的实例的代码如下,由于个人站空间有限,不能提供源文件下载。主场景中有两个按钮,实例名为start和cancel。为了使trace有效,请在开发环境中测试这些代码,而不是发布之后运行。
//http://www.cloudward.net/map/flash_51ditu.swf
var mcl=new MovieClipLoader();
var started;
var mc:MovieClip;
start.onRelease=function(){
started=true;
mcm=_root.createEmptyMovieClip("mcm",10);
mc=mcm.createEmptyMovieClip("mc",11);
mcl.loadClip("http://www.cloudward.net/map/flash_51ditu.swf",mc);
}
cancel.onRelease=function(){
trace(_root.mcm);
_root.mcm.removeMovieClip();
//unloadMovie(_root.mc);
//mcl.unloadClip(mc);
}
var listener:Object=new Object();
listener.onLoadComplete=function(){
trace("onLoadComplete");
}
listener.onLoadError=function(){
trace("onLoadError");
}
listener.onLoadStart=function(mc){
//mc.unloadMovie();
trace("onLoadStart");
mcl.unloadClip(mc);
}
this.onEnterFrame=function(){
var o:Object=mcl.getProgress(mc);
//if(started && o.bytesLoaded!=o.bytesTotal)
//trace(Math.round(o.bytesLoaded/o.bytesTotal*100));
}
mcl.addListener(listener);
“在解决第一帧导出”导致的loading不显示问题。
2006年9月2日Flash的“在第一帧导出”导致第一帧内容大大增加!
在第一帧导出,会导致在Loading前就把你用来attach的MC、声音、V2组件……全部下载了。
这往往导致Loading总是从很大的数字开始显示,比如60%,而之前,屏幕上显示空白!
如果直接去掉使用第一帧导出,则可能使你的剪辑不被包含到swf文件中。
解决方法:
情况1:V2组件
去掉库中组件的“第一帧导出”选项,然后在“发布设置”-AS版本-“设置”-“导出用于类的帧”中写一个在loading之后的帧号。
情况2:声音
去掉库中声音的在第一帧导出。
新建一个空剪辑,然后把需要的声音全部放到剪辑的第一帧以外的帧。
把剪辑放在loading之后使用之前的某一帧,并且让剪辑仅仅持续一帧,这样剪辑中的声音是不会得到播放的,但是肯定会被包含到swf文件中。
情况3:MC
同2方法。直接把要的mc放置loading之后使用之前的某一帧,并且放在舞台之外。
removeMovieClip()失效怎么办?-修正UI2组件带来的层的bug
2006年9月1日Flash MX 2004 一旦插入了UI2组件或者库里存在UI2组件,使用_root.getNextHighestDepth()得出来的值就是1048576了,换句话说getNextHighestDepth()这个命令在这里就是失效了.此时所获得的层的深度就已经超出了Flash层的动态区(0~1048575)。所有存放在超出动态区的MC都是无法用removeMovieClip()删除的.
原因就是因为插入UI2组件或者在库中存放有UI2组件的时候,flash会自动在_root里的层动态区里的最高两个层里添加两个看不见的mc:_level0.reserved和_level0.focusManager 用
trace(_root.getInstanceAtDepth(1048575))和
trace(_root.getInstanceAtDepth(1048574))就可以看到.
解决方法就是在_root第一帧动作的最前面增加
_root.reserved.swapDepths(-2)和
_root.focusManager.swapDepths(-1)这两个语句,然后
trace(_root.getNextHighestDepth())
就可以得到是0而不是1048576了.
尽量使用for in 循环
2006年8月7日首先需要指出的是,能使用for in的地方尽量不要使用for(;;)。
下面这段话摘自flash AS2手册:for… in…
[code]
迭代对象的属性或数组中的元素,并对每个属性或元素执行 statement。对象的方法不能由 for..in 动作来枚举。
有些属性不能由 for..in 动作来枚举。例如,不能枚举影片剪辑属性(注:这可能带来一个好处是提到迭代影片剪辑自定义属性以及子剪辑的速度),例如 _x 和 _y。在外部类文件中,和实例成员不同的是,静态成员是不能枚举的。
for..in 语句迭代所迭代对象的原型链中对象的属性。首先枚举该对象的属性,接着枚举其直接原型的属性,然后枚举该原型的原型的属性,依次类推。for..in 语句不会将相同的属性名枚举两次。如果 child 对象有原型 parent,并且两者都包含属性 prop,则对 child 调用的 for..in 语句将枚举来自 child 的 prop,而忽略 parent 对象中的该属性。
[/code]
如果只执行一条语句,用来括起要由 for..in 语句执行的语句块的花括号 ({}) 是不必要的。
如果在一个类文件(外部 AS 文件)中编写一个 for..in 循环,则实例成员对于该循环不可用,而静态成员则可用。然而,如果在一个 FLA 文件中为类的实例编写一个 for..in 循环,则实例成员在循环中可用,而静态成员不可用。
Flash使用for in迭代它的所谓哈西对象的成员。Flash的Object类本身就具备添加hash字段的能力,可以给任何类实例添加名字-值对,而且是以哈西表的方式存储。知道一点数据结构的人都知道,hash表是为了随机存取而设计的,而使用for in迭代哈西表是在Flash解释器中实现的,使用C++,效率不是一般的高。
相对而言,for(;;)就显得臃肿一些。因为for(;;)中一般情况下都难免出现索引的递增,一般情况下我们都是按照这种方式来使用:for(var i=0;i
现在明白为什么要使用for in了b吧?在重复执行n多次的程序中,这个细微差别就相当显著了。而且有一点,当给一个电影剪辑添加了很多子剪辑或者属性的时候,不要担心迭代的时候剪辑有很多内置属性,for in会在上面浪费时间。
检验代码:[code]
var o:Object=new Object();
var a:Array=new Array();
for(var i=0;i<100000;i++){
o["i"+i]=i;
}
;
for(var i=0;i<100000;i++){
a.push(i);
}
var x;
var t1=getTimer();
var len=a.length;
for(var i=0;i x=a;
}
var t2=getTimer()
for(var prop in o){
x=o;
}
var t3=getTimer();
trace(t1);
trace(t2);
trace(t3);
out:
3787
4331
4750[/code]
AS关于内联方式初始化属性的一个bug
2006年8月7日按照oop规范,类的以内联方式初始化的属性,仍然是实例变量,而不是静态变量,但是在AS2中,出现这种情况:
class A{
public var prop:Object=new Object();
}
当我生成多个A实例的时候,居然发现prop指向同一个对象,如果我在构造函数中初始化该属性,则不会发生这种情况。这是不符合oop规范的。
类外使用的属性
2006年8月7日类外使用的属性,常常发生在将一个私有方法赋给一个公开的事件处理函数时。
其原因在于访问权限的控制发生错误,不可将一个私有成员赋值给一个公有成员,因为这样你就可以通过这个公有成员访问原来不能访问的私有成员了。
一般而言,访问权限只能缩小不可一放大,比如你可以将一个公有成员赋值给私有成员,但是反过来就不可以。