感谢郭嘉!
发表评论»2010已然结束,大家都很给力,天下太平!感谢ZF,感谢D,感谢郭嘉!
2010已然结束,大家都很给力,天下太平!感谢ZF,感谢D,感谢郭嘉!
SharedObject类创建的本地共享对象(LSO:local shared object)类似于浏览器cookie,所以也被称作Flash Cookie。类似只是在作用上类似,都是用于将数据保存于客户端,可进行读写。
不同之处似乎更多:
静态getLocal()方法是LSO创建和打开以进行读取的机制。getLocal()方法会返回ShareObject实例,用以取代new运算符以实例化新LSO实例。调用getLocal()方法时至少需要为其传入一个参数,即是LSO的名称;第二个参数是为LSO指定存储路径便于其他swf共享该LSO数据,默认保存路径为创建LSO的swf文件所在唯一域、路径和文件名组成;第三个参数用以确定对此共享对象的访问是否只限于通过HTTPS连接传递的swf文件,默认false。如:var user:SharedObject = SharedObject.getLocal(‘user’,'/’);
LSO通过其一个特殊的内建属性data来存储所有数据,如:user.data.name = ‘xxxx’;
在Flash Player卸载时、SharedObject实例被当成垃圾回收时、当调用SharedObject.clear()方法时,LSO数据都会自动保存至本地磁盘。但是这些方法都不值得信赖,推荐的方式是使用SharedObject.flush()方法来对LSO数据进行存储。flush()方法有一个可选参数,指定写入数据时应该使用的最小磁盘空间量,默认值为0,表示只使用所需的最小空间。
调用flush()方法返回以下三种结果:
LSO数据的读取与写入一样简单,只需将共享对象的data属性内的对应属性读取出来即可,如:var name:String = user.data.name;
而删除LSO对象中的数据则需要使用delete运算符,如:delete user.data.name;如需要删除整个LSO对象,调用clear()方法即可:user.clear();
以下代码定义了三个函数setCookie、getCookie、delCookie用以创建/修改、获取、删除LSO数据:
//LSO/FlashCookie wondger@gmail.com
import flash.events.NetStatusEvent;
function setCookie(lsoname:String,cname:String,cvalue:*,path:String=null):Boolean{
var lso:SharedObject = (path!=null&&path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
lso.data[cname] = cvalue;
try{
var flushResult:String = lso.flush();
if(flushResult == SharedObjectFlushStatus.FLUSHED) return true; //数据保存成功
else if(flushResult == SharedObjectFlushStatus.PENDING) lso.addEventListener(NetStatusEvent.NET_STATUS,onStatus); //空间不够时
}catch(e:Error){
Security.showSettings(SecurityPanel.LOCAL_STORAGE); //用户禁止保存数据,打开Player的“settings”对话框
}
function onStatus(evt:NetStatusEvent):Boolean{
lso.removeEventListener(NetStatusEvent.NET_STATUS,onStatus);
if(evt.info.code == 'SharedObject.Flush.Success') return setCookie(lsoname,cname,cvalue); //用户同意允许请求更多的空间
return false;
}
return false;
}
function getCookie(lsoname:String,cname:String,path:String=null):*{
var lso:SharedObject = (path!=null&&path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
return lso.data[cname];
}
function delCookie(lsoname:String,cname:String=null,path:String=null):Boolean{
var lso:SharedObject = (path!=null&&path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
if(lso){
if(cname && cname != null){
delete lso.data[cname];
lso.flush();
}else lso.clear();
return true;
}
return false;
}
当然还可以使用JavaScript进行一定的封装方便跨浏览器操作(对检测flash加载完成addCallback注册函数可用一直纠结了很久,没有找到太满意的方法,现在这个将就用):demo
———————————————
update 2011/7/27
补充下,上面提到的间接地实现expires
文章写了很久也忘记了,我想可以这样,每次写cookie的时候,将expires作为一个数据字段保存,即user.data.expires = ****,每次读取cookie的时候,都将此expires读取出来与当前时间比较即可。
AS3中本身并没有提供绘制扇形的的方法,但是可以利用curveTo()来间接的完成这一任务。curveTo()绘制的曲线是接近Bezier曲线的曲线,并不是标准的圆弧,所以如果对精确度要求过高并不合适。
为了写这个类,努力地去回忆了下高中几何知识,再借助万能的Google才拼出了下面这张图(相信你一看就懂),看大图。

看看demo~
Sector.as 源码(提供了一个reDraw方法,重新传递半径、起始角度和角度clear后重新绘制):
import flash.display.Sprite;
//Description:draw a sector by curveTo()
//Email:wondger[at]gmail.com
//Blog:http://omiga.org/
//Date:2010-08
public class Sector extends Sprite{
private var _x0:Number; //圆心横坐标
private var _y0:Number; //圆心纵坐标
private var _r:Number; //圆半径
private var _a0:Number; //起始角度 0度开始顺时针方向
private var _lineWidth:Number; //线条宽度
private var _lineColor:Number; //线条颜色
private var _fillColor:Number; //填充颜色
public function Sector(x0:Number,y0:Number,r:Number,a0:Number,a:Number,lineWidth:Number=1,lineColor:Number=0xFF0000,fillColor:Number=0xFFFF00){
_x0 = x0;
_y0 = y0;
_r = r;
_a0 = a0*Math.PI/180;
_lineWidth = lineWidth;
_lineColor = lineColor;
_fillColor = fillColor;
if(a>0&&a<=360) drawSector(a);
}
private function drawSector(a:Number):void{
this.graphics.lineStyle(_lineWidth,_lineColor);
this.graphics.beginFill(_fillColor);
this.graphics.moveTo(_x0,_y0);
this.graphics.lineTo(_x0+_r*Math.cos(_a0),_y0+_r*Math.sin(_a0)); //曲线绘制起始点
var n:uint = Math.floor(a/45); //分段绘制接近Bezier曲线的曲线,分段越细,曲线越接近真实圆弧线
var a0:Number = _a0; //记录初始角度
while(n-->0){
a0+=Math.PI/4;
this.graphics.curveTo(_x0+_r/Math.cos(Math.PI/8)*Math.cos(a0-Math.PI/8),_y0+_r/Math.cos(Math.PI/8)*Math.sin(a0-Math.PI/8),_x0+_r*Math.cos(a0),_y0+_r*Math.sin(a0));
}
if(a%45){
var am:Number = a%45*Math.PI/180;
this.graphics.curveTo(_x0+_r/Math.cos(am/2)*Math.cos(a0+am/2),_y0+_r/Math.cos(am/2)*Math.sin(a0+am/2),_x0+_r*Math.cos(a0+am),_y0+_r*Math.sin(a0+am));
}
this.graphics.lineTo(_x0,_y0);
this.graphics.endFill();
}
public function reDraw(r:Number,a0:Number,a:Number):void{
if(a>0&&a<=360){
_r = r;
_a0 = a0*Math.PI/180;
this.graphics.clear();
drawSector(a);
}
}
}
WP3.0这个后台煞白煞白的,晚上很闪眼睛!
博客放在这两三年了,最近一年多很少来更新。但是基本上天天都会看看,也不清楚看什么。尽量保证每个月有更新,不管什么内容,记录下就行,积少成多!
这个月项目不少,晚上加过几次班,都到10点后。谈不上充实有意义,只是没有闲着蛋疼!
刚看完《高性能网站建设—进阶指南》,挺不错,还是有些收获。《影响力》也正在看,挺有意思的一本书。
月初搬家到离公司几分钟路程的地方,现在每天8:40左右起床到公司都算早。这片小区比较无聊,晚上10后出去晃悠,都看不到啥人,不比以前。
最近身边朋友啥的,离职、跳槽、回家的不少,不论如何选择,希望都能一切如意!
说object?说啥呢?先简单说下object历史。Long long ago……为了实现将大量不需要在服务端的运算转移到到客户端,NetScape(NS)率先率先实现了对Java applet的支持。当时如日中天的微软当然不甘落后,而且微软觉得自己可以更NB一点,于是自己重新开发了ActiveX以替代Java applet。众所周知,HTML是标记性语言,任何的内容都需要标签来表示。于是NetScaple使用了<applet>标签来嵌入Java applet,IE则使用<object>标签来嵌入ActiveX。尽管在当时NS具有绝对优势的市场份额,而IE因与windows捆绑也“鸡犬升天”,一步步蚕食着NS的市场,双方为了争夺更多的用户,NS在随后的版本中也实现了对<object>的支持,当然仅仅是实现了对<object>标签的支持,而不是ActiveX;而IE则也开始支持<applet>和<embed>标签。
后来HTML4提出了一个概念-inclusions(包含对象),Java applet、ActiveX均是inclusions,也包括.png、.gif等图像文件,.avi等视频文件。同时标准建议使用<object>标签来嵌入inclusions。主流浏览器也开始提供对<object>更为良好的支持,但是在实现上还是存在一些差异。比如IE始终将<object>嵌入的对象作为ActiveX来处理。
那么如何使用<object>来嵌入对象?举一个大家都很熟悉的嵌入flash的例子。以下三段代码均能在现代主流浏览器中得到正确地解析而将flash嵌入到页面中。
<embed src="temp.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="200" height="200"></embed>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="200" height="200">
<param name="movie" value="temp.swf" />
<param name="quality" value="high" />
</object>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="200" height="200">
<param name="movie" value="temp.swf" />
<param name="quality" value="high" />
<embed src="temp.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="200" height="200"></embed>
</object>
正如前面所说,由于历史原因,最初对嵌入对象的实现方式不尽相同,但到今天个主浏览器对嵌入对象方式都具有了较好的兼容性。不论是使用<embed>,还是<object>都能在页面中嵌入对象。第三段代码是Dreamweaver中插入flash使用的代码,这段代码更好地解决了浏览器兼容性的问题,包括一些老版本浏览器。当浏览器不支持<object>标签时,会解析<object>中除<param>外的其他标签,所以第三段代码较之第一、二段代码具有更好的兼容性。
关于<object>中相关属性的介绍就不在此赘述了,大家可参考其他一些资料都有详细介绍。在此提醒两处需要注意的地方:
function getSwfMovie(movieName){
if(navigator.appName.indexOf("Microsoft")!=-1) return window[movieName];
else return document[movieName];
}
但是该方法在Firefox中无法获取到对象,而是需要通过获取<embed>来完成
function getSwfMovie(movieName){
if(navigator.appName.indexOf("Microsoft")!=-1) return window[movieName];
else return document[movieName].getElementsByTagName("embed")[0];
}