Flash P2P 对象复制详解

2010年12月29日 6 条评论

简介

flash player 10.1增加了p2p(pear to pear)的支持,可以先看下flash最简单的p2p对象复制demo

对象复制

调用NetGroup的 addHaveObjects()removeHaveObjects()addWantObjects()removeWantObjects()writeRequestedObject() 和 denyRequestedObject() 以将大型数据分解成数据片段,然后将其复制到对等组中的所有节点。

阅读全文...

最简单的Flash P2P对象复制示例

2010年12月28日 4 条评论

flash player10.1添加了P2P(pear to pear点对点)功能。

P2P有好多特性,其中有一个是对象复制。

什么是对象复制?

将大型数据分解成数据片段,然后将其复制到对等组中的所有节点。 大数据不利于网络传输,那么将大数据分解成一个一个的小片段,给每个片段一个编号,将这些片段复制到对等组里的每个节点,OK,再有一个新节点需要这个数据的时候就从就近的节点获取数据,源节点并不传送数据所有节点,提高了数据传输效率。

阅读全文...

flash里的普通按钮(SimpleButton)实现九宫格缩放

2010年12月22日 4 条评论

Flash创作工具(FlashIDE)里画九宫格是很方便的。
对于影片剪辑(MovieClip)直接有画九宫格的选项。

MovieClip有九宫格选项
mc-for-9-slice-scaling-option.png

按钮不支持直接画九宫格
button-not-9-slice-scaling-option.png

但是我们可以通过其他方法设置按钮的九宫格。
阅读全文...

SharedObject 多文件实时共享

2010年9月28日 7 条评论

SharedObject 是个好东西,它跟html的cookie类似,都能在本地存储数据,但又比cookie强大,可以存储更多的类型。 OK,知道了SharedObject的用处,我们来玩点高级点的。
阅读全文...

绕过flash安全沙箱限制(security sandbox)读取可视对象数据

2010年9月5日 18 条评论

问题描述

当我们加载外部域的图片或swf,并且想对其内容进去操作时报一个flash安全沙箱错误。
类似这样的:

SecurityError: Error #2122: 安全沙箱冲突:Loader.content:http://www.litefeel.com/crossSecurityBoxDemo.swf 不能访问 https://lite3-resouce.googlecode.com/svn/trunk/assets/image/duck.jpg。需要一个策略文件(crossdomain.xml),但在加载此媒体时未设置 checkPolicyFile 标志。

有这样几种安全沙箱错误:

  • 需要一个策略文件,但在加载此媒体时未设置 checkPolicyFile 标志。
  • 有一个策略文件,但未被授权访问或拒绝访问。
  • 加载swf并要脚本互访时,未被授权访问,可以用Security.allowDomain解决。

解决方法

  • 用Adobe建议的方法,添加策略文件,添加Security.allowDomain。
  • 通过loadBytes绕过安全沙箱。

第一种方法是常规的方法,但是很多时候我们加载的图片不是自己的,对方服务器肯定不会给我们授权的。
那么这时第二种方法就派上用场了。
下面先看个demo再看源码。
阅读全文...

flash getSize 方法

2010年7月25日 2 条评论

今天看 优化 Flash 平台的性能 帮助文档时发现一个未公开的顶级函数 getSize()
猜想getSize的接口可能是:

/**
 * 获取对象的内存占用量
 * @param   p   任意类型,甚至是Class
 * @return  一个数值,单位是byte
 */
public function getSize(p:*):uint;

不过这个方法只能在时间轴上使用,在类里就不能用了。
感谢jim提醒,原来这个方法在flash.sampler包下,请看 flash.sampler.getSize()
然后我测试了下flash里有没有内存对齐的概念。
不过获得的内存值都是4的倍数。
如果里面有属性占用为8,则结果则为8的倍数。

相关链接:

节省内存-显示对象
节省内存-原始类型

标签: , ,

弱引用 addEventListener

2010年6月27日 6 条评论

之前只是知道尽量用强引用,不要用弱引用,因为弱引用会被垃圾回收. 对于flash.utils.Dictionary倒是没有什么疑问.但EventDispatcher.addEventListener就不明白具体是侦听器被回收了,还是侦听者被回收了。
昨天有看了一些文章,又想起这个问题,就想要理解透彻,于是又仔细看了下API文档.

Class-level member functions are not subject to garbage collection, so you can set useWeakReference to true for class-level member functions without subjecting them to garbage collection. If you set useWeakReference to true for a listener that is a nested inner function, the function will be garbge-collected and no longer persistent. If you create references to the inner function (save it in another variable) then it is not garbage-collected and stays persistent.

原来这里的弱引用是对侦听器的(侦听器函数),跟侦听者没有关系. 为了验证这个观点,我做了个小Demo。
OK,让我们来一边享受引用,一边学习吧。
阅读全文...

URLLoader 404 Error 与 complete事件

2010年3月31日 6 条评论

最开始发现是在AS2里用MovieClipLoader加载图片,那次地址写错了,但是依然有onLoadComplete事件触发。
请看下面的代码:

var mc:MovieClip = _root.createEmptyMovieClip("mc", 1);
var loader:MovieClipLoader = new MovieClipLoader();
var listener:Object = {};
loader.addListener(listener);

// 加载一个错误的图片地址,但只要有数据返回就会触发complete事件
loader.loadClip("http://www.litefeel.com/errorJpg.jpg", mc);

listener.onLoadComplete = function(target:MovieClip):Void
{
    trace("this is loadComplete!");
}

OK,上面明明是一个错误的图片地址,竟然会触发onLoadComplete事件。
然后用浏览器打开这个错误的地址看了下,是一个404Error页面。又换了好多个地址,不同域名的,可是依然会触发onLoadComplete事件。
所以猜想可能是只要有数据返回就会触发onLoadComplete事件吧(onLoadInit也是一样)。
测试LoadVars后更加断定我的猜想,请看代码:

var loader:LoadVars = new LoadVars();
loader.onLoad = function (success:Boolean):Void
{
    trace("success = " + success);
    trace(loader);
}
// 请更改为非跨域的不存在的地址
loader.load("http://www.litefeel.com/fdsafdsa");

我想这可能是AS2的一个bug吧,不知道AS3里解决了没有。
测试后发现Loader不存在这样的问题了,但是URLLoader,URLStream依然会触发Event.COMPLETE事件。
或许这不是bug,可能Adobe设计的时候就是complete为数据接收完毕,不论是404页面还是原本的地址。
那么我怎么才能知道是我原本想请求的数据还是一个404呢。
可能在HTTPStatusEvent.HTTP_STATUS 这个事件里会给让我区分吧。
测试发现明明由一个不存在地址跳转到404页面,但flashplayer收到的httpStatusCode竟然是200,就是说flashplayer认为这不是错误的请求,是正常的。
请看这个demo:
输入一个随便输入一个网址,如果有跨域请更换地址,再看httpStatusCode和返回的data。
在Event.COMPLETE事件里获取到data数据的。

这是一个urlloader对404错误的测试demo,如果你看不到这个flash,请到文章页面查看!

结果表明:Event.COMPLETE事件在完整数据返回后触发,而不管是404页面还是其他。
存在的问题:没有办法区别是否404页面。
再看官方帮助上对HTTPStatusEvent.HTTP_STATUS的解释。

Dispatched if a call to URLLoader.load() attempts to access data over HTTP. For content running in Flash Player, this event is only dispatched if the current Flash Player environment is able to detect and return the status code for the request. (Some browser environments may not be able to provide this information.) Note that the httpStatus event (if any) is sent before (and in addition to) any complete or error event.

OK,某些浏览器可能不能获取httpStatusCode,但是这个却返回了httpStatusCode:200。

感谢 12345 的回复.原来我之前博客的404页面是直接跳转,但是没有将状态码变成404,返回的依然是正常的状态码200,所以flashplayer认为这是一个正常的页面,而不是404,现在将状态码改成404了,这样flashplayer就返回IOError了,现在一切正常了

本例demo下载☞

标签: , , , ,

AS2的异常Error

2010年3月28日 2 条评论

前几天在调试一个AS2跟后台通信的程序,一直看不到正常的数据显示,然后就挨行trace,终于发现问题所在了.
原来是用了AS2的一个JSON类,如果格式不是json格式就会抛出异常,因为我们的数据格式不会错的,要么就没有数据,否则不会出现格式错误的,所有就没有try catch。
刚好这次测试的时候有一个元素里没有数据,json串为""(空字符串)。然后解析的时候抛了个异常,我没有捕获,就终止那段程序。
请看AS2的JSON里抛异常的方式:
阅读全文...

标签: , , ,

AS2 ComboBox 皮肤设置

2010年3月16日 2 条评论
这是一个AS2的comboBox更换皮肤的效果demo,如果你看不到这个flash,请到文章页面查看!

阅读全文...

标签: , ,
回到顶部