<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LuoYe &#187; ATIONSCRIPT</title>
	<atom:link href="http://www.luoye.org/blog/category/source/ationscript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.luoye.org/blog</link>
	<description>又一个 WordPress 博客</description>
	<lastBuildDate>Wed, 11 Jan 2012 05:51:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Flex AIR 最小化到系统托盘</title>
		<link>http://www.luoye.org/blog/2012/01/flex-air-dock/</link>
		<comments>http://www.luoye.org/blog/2012/01/flex-air-dock/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 05:45:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=344</guid>
		<description><![CDATA[import mx.events.CloseEvent; import mx.controls.Alert; //====================================系统关闭和托盘小图标处理================= //系统小图标 private var dockImage:BitmapData; //初始化Application里调用此方法,完成上面的第一步: public function initApplication():void{ var loader:Loader=new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,prepareForSystray);//这里就是完成第一步的任务项,这个prepareForSystray就是对托盘的生在和菜单的控制 loader.load(new URLRequest(&#8220;1-5.gif&#8221;));//这里先要加载托盘图标的小图片 this.addEventListener(Event.CLOSING,closingApplication);//设置关闭体的事件 } //关闭窗体的事件 public function closingApplication(event:Event):void{ event.preventDefault();//阻止默认的事件 Alert.yesLabel=&#8221;退出&#8221;; Alert.noLabel=&#8221;最小化&#8221;; Alert.show(&#8220;退出应用程序或者最小化窗口到系统小图标？&#8221;, &#8220;系统提示&#8221;, Alert.YES&#124;Alert.NO&#124;Alert.CANCEL, this, alertCloseHandler);//弹出自定义的选择框, 关于Alert的详细用法,参考官方文档或我前面的相关文章. Alert.yesLabel=&#8221;是&#8221;; Alert.noLabel=&#8221;否&#8221;; } //根据用户的选择来判断做什么,这里选择是就是关闭,选择否(Mini)就是最小化到托盘. private function alertCloseHandler(event:CloseEvent):void{ if(event.detail==Alert.YES){ closeApp(event); }else if(event.detail==Alert.NO){ dock();//最小化到托盘 } } //生成托盘 public function prepareForSystray(event:Event):void{ dockImage=event.target.content.bitmapData; if(NativeApplication.supportsSystemTrayIcon){ setSystemTrayProperties();//设置托盘菜单的事件 [...]]]></description>
			<content:encoded><![CDATA[<p>import mx.events.CloseEvent;<br />
import mx.controls.Alert;<br />
//====================================系统关闭和托盘小图标处理=================</p>
<p>//系统小图标<br />
private var dockImage:BitmapData;</p>
<p>//初始化Application里调用此方法,完成上面的第一步:<br />
public function initApplication():void{<br />
var loader:Loader=new Loader();<br />
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,prepareForSystray);//这里就是完成第一步的任务项,这个prepareForSystray就是对托盘的生在和菜单的控制<br />
loader.load(new URLRequest(&#8220;1-5.gif&#8221;));//这里先要加载托盘图标的小图片<br />
this.addEventListener(Event.CLOSING,closingApplication);//设置关闭体的事件<br />
}<br />
<span id="more-344"></span><br />
//关闭窗体的事件<br />
public function closingApplication(event:Event):void{<br />
event.preventDefault();//阻止默认的事件<br />
Alert.yesLabel=&#8221;退出&#8221;;<br />
Alert.noLabel=&#8221;最小化&#8221;;<br />
Alert.show(&#8220;退出应用程序或者最小化窗口到系统小图标？&#8221;, &#8220;系统提示&#8221;, Alert.YES|Alert.NO|Alert.CANCEL, this, alertCloseHandler);//弹出自定义的选择框, 关于Alert的详细用法,参考官方文档或我前面的相关文章.<br />
Alert.yesLabel=&#8221;是&#8221;;<br />
Alert.noLabel=&#8221;否&#8221;;<br />
}<br />
//根据用户的选择来判断做什么,这里选择是就是关闭,选择否(Mini)就是最小化到托盘.<br />
private function alertCloseHandler(event:CloseEvent):void{<br />
if(event.detail==Alert.YES){<br />
closeApp(event);<br />
}else if(event.detail==Alert.NO){<br />
dock();//最小化到托盘<br />
}<br />
}</p>
<p>//生成托盘<br />
public function prepareForSystray(event:Event):void{<br />
dockImage=event.target.content.bitmapData;<br />
if(NativeApplication.supportsSystemTrayIcon){<br />
setSystemTrayProperties();//设置托盘菜单的事件<br />
SystemTrayIcon(NativeApplication.nativeApplication.icon).menu=createSystrayRootMenu();//生成托盘菜单<br />
}<br />
dock();<br />
}</p>
<p>//生成托盘右键菜单<br />
public function createSystrayRootMenu():NativeMenu{<br />
var menu:NativeMenu = new NativeMenu();<br />
var openNativeMenuItem:NativeMenuItem = new NativeMenuItem(&#8220;还原&#8221;);//生成OPEN菜单项<br />
var exitNativeMenuItem:NativeMenuItem = new NativeMenuItem(&#8220;退出&#8221;);//同理<br />
openNativeMenuItem.addEventListener(Event.SELECT, undock);<br />
exitNativeMenuItem.addEventListener(Event.SELECT, closeApp);//添加EXIT菜单项事件<br />
menu.addItem(openNativeMenuItem);<br />
menu.addItem(new NativeMenuItem(&#8220;&#8221;,true));//separator<br />
menu.addItem(exitNativeMenuItem);//将菜单项加入菜单</p>
<p>return menu;<br />
}<br />
//设置托盘图标的事件<br />
private function setSystemTrayProperties():void{</p>
<p>SystemTrayIcon(NativeApplication.nativeApplication .icon).tooltip =&#8221;我的系统&#8221;;<br />
SystemTrayIcon(NativeApplication.nativeApplication .icon).addEventListener(MouseEvent.CLICK, undock);<br />
stage.nativeWindow.addEventListener(NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, nwMinimized);<br />
}</p>
<p>//最小化窗体<br />
private function nwMinimized(displayStateEvent:NativeWindowDisplayStateEvent):void {<br />
if(displayStateEvent.afterDisplayState == NativeWindowDisplayState.MINIMIZED) {<br />
displayStateEvent.preventDefault();//阻止系统默认的关闭窗体事件<br />
dock();//将程序放入托盘<br />
}<br />
}</p>
<p>//将本地应用程序放到托盘<br />
public function dock():void {<br />
//stage.nativeWindow.visible = false; //设置本地程序窗体不可见<br />
NativeApplication.nativeApplication.icon.bitmaps = [dockImage];//设置托盘的图标<br />
}</p>
<p>//激活程序窗体<br />
public function undock(evt:Event):void {<br />
//stage.nativeWindow.visible = true;//设置本地程序窗体可见<br />
stage.nativeWindow.orderToFront();//设置本地程序窗体到最前端<br />
//NativeApplication.nativeApplication .icon.bitmaps = [];//将托盘图标清空<br />
}</p>
<p>//关闭程序窗体<br />
private function closeApp(evt:Event):void {<br />
stage.nativeWindow.close();<br />
}<br />
//====================================系统关闭和托盘小图标处理=================</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2012/01/flex-air-dock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe AIR 3新特性（支持iOS和Android平台）</title>
		<link>http://www.luoye.org/blog/2011/12/adobe-air-3-ios-android/</link>
		<comments>http://www.luoye.org/blog/2011/12/adobe-air-3-ios-android/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 12:58:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=341</guid>
		<description><![CDATA[自从2008年发布了第一个版本，Adobe AIR已经走过了很长的一段路。在此期间，我们为AIR增加了几十个较大的特性，上百个较小的特性，性能优化和错误修复，并且我们支持3个额外的平台：iOS (iPhone和iPad),Android, 和Adobe AIR for TV. AIR 3将是我们在不到两年半的时间里的第11个发行版本。虽然我们每次的发行版都代表了很大的进步，但我个人觉得这次是非比寻常的。AIR 3包括以下新的API和特性： Stage3D（桌面特性）。Stage3D是一个底层的，具备硬件加速的二维和三维渲染的 API。对于AIR 3，目前这些API只能在AIR的桌面版本中使用，然而，未来这些特性也将进入移动设备。Stage3D是一个非常重要的特性，它的意义之大让我们感到言语都难以描述，您可以从这里得到更加详细的信息， 请参阅Stage 3D页面。 本地扩展 （所有平台）。这又是一个重要的特性。从AIR 3的版本开始，开发者可以通过绑定本地扩展和应用程序，来增强AIR运行时的功能，然后他们就可以在ActionScript中调用那些扩展（这个特性原先只在Adobe AIR 2.5 for TV中存在，但是基于AIR 3，这个特性在所有的平台可用）。您可以认为Adobe AIR本地扩展（简称ANEs）就是ActionScript库（SWCs），只不过是包含了本机代码实现。ANEs的适用场合，包括让您的应用程序访问 AIR所不支持的原生API（见下面的例子），并授权在某些情况下访问本机代码，以达到更好的性能。关于更多AIR 3本地扩展的信息，请参阅奥利弗.高盛的这篇文章:扩展Adobe AIR。 Android Market的授权集成 （显然只支持Android）。使用ANE文件，开发人员可以访问Android Market的授权服务，让发布者执行许可政策。这是一个能体现ANE强大特性的很好的例子：因为这个特性(授权服务)在iOS中是不可用的，所以我们不会把它作为AIR的直接支持的功能；但是，ANE可以保证我们运行于Android设备的AIR应用可以很轻松的访问这些API。 运行时捆绑 （Android和桌面）。在之前的版本中，需要您的最终用户在安装您的应用之前，已经安装了AIR的运行时(如果没有，则必须先安装AIR运行时)，如果您想改变这个过程(让您的应用程序安装过程和其它本地安装的应用程序没有区别)，或者您是想控制您的应用程序运行所需的AIR版本，AIR 3允许您捆绑AIR运行时和您的应用程序。捆绑运行时非常容易，当您构建一个Android应用时可以设置apk-captive-runtime变量，如果是构建桌面应用，则可以设置bundle变量。（注意在iOS上AIR一直使用一个捆绑的运行时，虽然其机制不太相同。） 背景音频播放 （对于iOS是新特性;在Android上之前就被支持了）。由于iOS独特的多任务模式，在之前如果我们想在AIR应用处于非活动状态的时候继续播放音频，是不可能的。在AIR 3中，您所需要做的只是修改您的应用程序描述文件，声明您需要播放背景音乐，然后它会自动工作。（基本上，当应用程序被放置到后台程序中，它将继续运行。但是，所有的屏幕更新将被禁用，以保持电池寿命，并符合iOS的多任务要求。） 在iPad对CameraRoll的支持。虽然CameraRoll在技术上已经被iPad支持，但是我们在AIR 3中增加了很多更好的支持。在iPad上，图片选择器不再占用整个屏幕，在iPhone和iPod touch上也是如此。相反，它会在调用它的UI组件的相对位置上，出现一个浮动的面板。使用额外的CameraRollBrowseOptions类，开发人员可以选择图像选择器的大小和位置，并指定调用它的UI组件的位置。欲了解更多信息和代码示例，请参阅我的博客文章， 如何正确使用iPad上的CameraRoll API 。 视频硬件加速 （移动设备）：AIR 2.5通过StageVideo为TV带来了视频硬件加速;现在AIR 3则为移动设备也提供了StageVideo。 本机文本字段（移动设备） 。之前版本的AIR提供给开发者访问底层渲染的能力，比如StageVideo (视频硬件加速)和StageWebView (本地的HTML渲染)。AIR 3提供了StageText的API，它允许开发人员将系统原生的文本字段放置在移动应用程序中。虽然您仍然可以使用Flash文本字段，但是 StageText文本字段可以使用所有操作系统底层支持的特性，比如放大镜，文本选择，自动更正等等。 前置摄像头支持 （iOS和Android）。现在ActionScript的摄像头API可以访问 iOS和Android设备的前置摄像头和后置摄像头(如果是Android设备，至少需要2.3的版本)。您可以使用新的 Camera.position属性以及新CameraPosition类中的常量（背部，正面，和UNKNOWN）来确定摄像机的位置。欲了解更多信息和代码示例，请参阅我的博客文章， AIR 3前置摄像头支持 。 移动设备的加密本地存储(带来了台式机和移动设备之间的等价实现)。EncryptedLocalStore的API曾经只在桌面上可用，现在则进入了iOS和Android。这个API用于安全地存储用户凭据，加密密钥，私密信息，和类似的重要信息。 设备扬声器控制 （移动设备）。使用新的SoundMixer audioPlaybackMode属性，和新的AudioPlaybackMode类中的常量（媒体和语音），开发人员可以控制是否是通过电话的听筒或扬声器播放音频。 原生JSON支持 （移动和台式机）。原先只能使用ActionScript来解析JSON，现在则是由运行时提供更有效的原生JSON支持。相对于ActionScript实现，原生的JSON API的速度更快，使用更少的内存。欲了解更多信息和代码示例，请参阅 AIR [...]]]></description>
			<content:encoded><![CDATA[<p>自从2008年发布了第一个版本，Adobe AIR已经走过了很长的一段路。在此期间，我们为AIR增加了几十个较大的特性，上百个较小的特性，性能优化和错误修复，并且我们支持3个额外的平台：iOS (iPhone和iPad),Android, 和Adobe AIR for TV.</p>
<p>AIR 3将是我们在不到两年半的时间里的第11个发行版本。虽然我们每次的发行版都代表了很大的进步，但我个人觉得这次是非比寻常的。AIR 3包括以下新的API和特性：<span id="more-341"></span></p>
<ul>
<li><strong>Stage3D（</strong>桌面特性）。Stage3D是一个底层的，具备硬件加速的二维和三维渲染的 API。对于AIR 3，目前这些API只能在AIR的桌面版本中使用，然而，未来这些特性也将进入移动设备。Stage3D是一个非常重要的特性，它的意义之大让我们感到言语都难以描述，您可以从这里得到更加详细的信息， 请参阅Stage 3D页面。</li>
<li><strong>本地扩展</strong> （所有平台）。这又是一个重要的特性。从AIR 3的版本开始，开发者可以通过绑定本地扩展和应用程序，来增强AIR运行时的功能，然后他们就可以在ActionScript中调用那些扩展（这个特性原先只在Adobe AIR 2.5 for TV中存在，但是基于AIR 3，这个特性在所有的平台可用）。您可以认为Adobe AIR本地扩展（简称ANEs）就是ActionScript库（SWCs），只不过是包含了本机代码实现。ANEs的适用场合，包括让您的应用程序访问 AIR所不支持的原生API（见下面的例子），并授权在某些情况下访问本机代码，以达到更好的性能。关于更多AIR 3本地扩展的信息，请参阅奥利弗.高盛的这篇文章:扩展Adobe AIR。</li>
<li><strong>Android Market的授权集成</strong> （显然只支持Android）。使用ANE文件，开发人员可以访问Android Market的授权服务，让发布者执行许可政策。这是一个能体现ANE强大特性的很好的例子：因为这个特性(授权服务)在iOS中是不可用的，所以我们不会把它作为AIR的直接支持的功能；但是，ANE可以保证我们运行于Android设备的AIR应用可以很轻松的访问这些API。</li>
<li><strong>运行时捆绑</strong> （Android和桌面）。在之前的版本中，需要您的最终用户在安装您的应用之前，已经安装了AIR的运行时(如果没有，则必须先安装AIR运行时)，如果您想改变这个过程(让您的应用程序安装过程和其它本地安装的应用程序没有区别)，或者您是想控制您的应用程序运行所需的AIR版本，AIR 3允许您捆绑AIR运行时和您的应用程序。捆绑运行时非常容易，当您构建一个Android应用时可以设置apk-captive-runtime变量，如果是构建桌面应用，则可以设置bundle变量。（注意在iOS上AIR一直使用一个捆绑的运行时，虽然其机制不太相同。）</li>
<li><strong>背景音频播放</strong> （对于iOS是新特性;在Android上之前就被支持了）。由于iOS独特的多任务模式，在之前如果我们想在AIR应用处于非活动状态的时候继续播放音频，是不可能的。在AIR 3中，您所需要做的只是修改您的应用程序描述文件，声明您需要播放背景音乐，然后它会自动工作。（基本上，当应用程序被放置到后台程序中，它将继续运行。但是，所有的屏幕更新将被禁用，以保持电池寿命，并符合iOS的多任务要求。）</li>
<li><strong>在iPad对CameraRoll的支持</strong>。虽然CameraRoll在技术上已经被iPad支持，但是我们在AIR 3中增加了很多更好的支持。在iPad上，图片选择器不再占用整个屏幕，在iPhone和iPod touch上也是如此。相反，它会在调用它的UI组件的相对位置上，出现一个浮动的面板。使用额外的CameraRollBrowseOptions类，开发人员可以选择图像选择器的大小和位置，并指定调用它的UI组件的位置。欲了解更多信息和代码示例，请参阅我的博客文章， 如何正确使用iPad上的CameraRoll API 。</li>
<li><strong>视频硬件加速</strong> （移动设备）：AIR 2.5通过StageVideo为TV带来了视频硬件加速;现在AIR 3则为移动设备也提供了StageVideo。</li>
<li><strong>本机文本字段</strong>（移动设备） 。之前版本的AIR提供给开发者访问底层渲染的能力，比如StageVideo (视频硬件加速)和StageWebView (本地的HTML渲染)。AIR 3提供了StageText的API，它允许开发人员将系统原生的文本字段放置在移动应用程序中。虽然您仍然可以使用Flash文本字段，但是 StageText文本字段可以使用所有操作系统底层支持的特性，比如放大镜，文本选择，自动更正等等。</li>
<li><strong>前置摄像头支持</strong> （iOS和Android）。现在ActionScript的摄像头API可以访问 iOS和Android设备的前置摄像头和后置摄像头(如果是Android设备，至少需要2.3的版本)。您可以使用新的 Camera.position属性以及新CameraPosition类中的常量（背部，正面，和UNKNOWN）来确定摄像机的位置。欲了解更多信息和代码示例，请参阅我的博客文章， AIR 3前置摄像头支持 。</li>
<li><strong>移动设备的加密本地存储</strong>(带来了台式机和移动设备之间的等价实现)。EncryptedLocalStore的API曾经只在桌面上可用，现在则进入了iOS和Android。这个API用于安全地存储用户凭据，加密密钥，私密信息，和类似的重要信息。</li>
<li><strong>设备扬声器控制</strong> （移动设备）。使用新的SoundMixer audioPlaybackMode属性，和新的AudioPlaybackMode类中的常量（媒体和语音），开发人员可以控制是否是通过电话的听筒或扬声器播放音频。</li>
<li><strong>原生JSON支持</strong> （移动和台式机）。原先只能使用ActionScript来解析JSON，现在则是由运行时提供更有效的原生JSON支持。相对于ActionScript实现，原生的JSON API的速度更快，使用更少的内存。欲了解更多信息和代码示例，请参阅 AIR 3中的原生JSON支持 。</li>
<li><strong>套接字(Socket)改进</strong>（移动和桌面）。曾经我们认为应该很容易的通过 ProgressEvent.SOCKET_DATA来读取从网络传到ActionScript套接字缓冲区的数据，并确定有多少个字节可供读取（Socket.bytesAvailable）。然而，事实尚非如此。换句话说，在AIR 3之前，没有办法知道有多少数据从ActionScript套接字成功地写入了网络的缓冲区，也不可能知道有多少数据正在等待被写入。这导致开发者不确定调用套接字的关闭是否是安全的，或知道当用户想关闭应用程序的时候，是否有一个网络进程还在处理中。通过AIR 3，开发人员可以使用OutputProgressEvent.OUTPUT_PROGRESS事件和Socket新属性.bytesPending，以确定有多少数据被写入到网络，多少数据在ActionScript套接字中仍在等待写入。这些新的API可以帮助我们构建更强壮的依赖套接字网络访问的应用程序。欲了解更多信息和代码示例，请参阅我的博客文章， AIR 3中套接字的改进 。</li>
<li><strong>H.264视频编码</strong> （桌面）。您可以将摄像头捕获的视频基于H.264进行编码。</li>
<li><strong>JPEG XR的支持</strong> （移动和台式机）。AIR 3现在支持JPEG XR，一个新的文件格式，相比JPEG有几个优点。例如，JPEG XR提供了更好的压缩率，更小的压缩损失，更准确的色彩，和Alpha透明度。欲了解更多信息，请查阅Wikipedia上的JEPG XR文章。</li>
<li><strong>更高分辨率的位图</strong>（移动和桌面） 。在之前的AIR中，位图被限制为16万像素（16777215像素）和8191的最大宽度/高度。在AIR 3中，所有的限制已被删除，这意味着现在的最大尺寸是由主机操作系统决定的，而不是AIR限制的。</li>
<li><strong>多声道数字音频输出</strong> （只支持AIR for TV）。现在电视上的Adobe AIR可以播放杜比数字+ 5.1环绕声和DTS 5.1音频流。新的Capabilities.hasMultiChannelAudio属性，新的AudioDecoder类（其中包含代表几个不同的多声道音频类型的常量），和Capabilities.serverString属性，都可以让开发者来检测设备的多声道音频功能，并从 ActionScript中通过RTMP协议输出正确的音频比特流。</li>
<li><strong>高级控制器支持</strong> （只支持AIR for TV）。使用新的GameInput API，开发人员可以构建基于高级电视控制器的游戏。一些新的API允许枚举设备（可用控制器），枚举设备的控制功能（按钮，触发器，加速度等），并从设备中得到控制值。</li>
<li><strong>更容易删除一个容器的所有的子元件</strong> （所有平台）。DisplayObjectContainer现在已经具备了removeChildren（）函数，它可以只用一个方法删除所有的子元件。这当然比下面的操作更有效：
<p>（this.numChildren&gt; 0）this.removeChildAt（0）</li>
<li><strong>更容易判断MovieClip是否在播放</strong> （所有平台）。通过使用新的isPlaying属性，可以很容易判断一个电影剪辑是否在播放。</li>
<li><strong>GC建议的API</strong>(所有平台）。新的System.pauseForGCIfCollectionImminent功能，可以让AIR开发人员更好地控制运行时的自动垃圾回收机制。由于垃圾回收有可能造成动画或音频的暂停，开发者可以在用户难以察觉的时候，使用这个方法鼓励垃圾回收。</li>
<li><strong>安全随机数生成</strong> （移动和桌面）。Adobe AIR中一直有Math.random方法可用，返回“伪随机”的数字，也就是说，这似乎是随机的，但总是包含一些非随机性（比如时间戳）的数字。AIR 3提供了一个用于生成随机数的新方法，称为generateRandomBytes（），位于flash.crypto包。由于 generateRandomBytes（）函数使用操作系统API来产生随机数（在Windows上是CryptGenRandom ，在OSX上是/dev/random , 在Android上是/dev/urandom, 在iOS上则是SecRandomCopyBytes），由此产生的随机数更有效，更安全。</li>
<li><strong>三次贝塞尔曲线</strong> （所有平台） 。新的cubicCurveTo（）方法是Graphics类的功能，允许您以编程方式绘制三次贝塞尔曲线，而且不使用第三方ActionScript代码。</li>
</ul>
<p>Adobe AIR 3作为一个候选发布版可以在Adobe实验室中找到 。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/12/adobe-air-3-ios-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as3 事件流机制的解释</title>
		<link>http://www.luoye.org/blog/2011/09/as3-even/</link>
		<comments>http://www.luoye.org/blog/2011/09/as3-even/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 05:00:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=338</guid>
		<description><![CDATA[通俗一点说吧 房子里面 有 冰箱 冰箱里面有饭盒 饭盒里面有食物 你可以理解成flash画面上的平面显示，也就是三层内嵌结构 Sprite嵌Sprite 再嵌Sprite 当你用鼠标在 食物上点击的时候 FlashPlayer就会沿路径向下寻找 这个过程叫做 捕获阶段，这个过程会走过 房子 冰箱 饭盒 第二步是目标阶段 即已经找到 食物了 第三步是冒泡阶段 FlashPlayer会沿原路向上回索 走的顺序是 饭盒 冰箱 房子 你可以理解成 捕获阶段是找出从顶级stage到目标食物之间的所有父子级包含关系 然后 找到目标了 ，携带着目标所发出的事件对象， 再根据捕获阶段找到的路 ，往回走，看看到底有哪些父级对象侦听了目标所发出的事件类型 上面的明白了 那你就很容易理解 target 和 currentTarget的区别了 target 就是目标对象 currentTarget 在事件流(冒泡阶段)中是不断变化的，依据是当时冒泡冒到哪一级对象 比如一个影片剪辑MC 里面有一个文本框TextField的话，我们为MC赋了侦听事件的话， 如果当时点击的范围在文本框上的话，target会指向这个文本框 而非添加侦听的MC， 在事件发生之初 ，即在目标阶段时 traget == currentTarget的 但因为会有冒泡事件 ，所以在事件冒泡到上级MC的时候，currentTarget 就等于MC了 但在整个事件流过程中，target是不变的 [...]]]></description>
			<content:encoded><![CDATA[<p>通俗一点说吧</p>
<p>房子里面 有 冰箱  </p>
<p>冰箱里面有饭盒</p>
<p>饭盒里面有食物</p>
<p>你可以理解成flash画面上的平面显示，也就是三层内嵌结构   Sprite嵌Sprite 再嵌Sprite</p>
<p>当你用鼠标在 食物上点击的时候</p>
<p>FlashPlayer就会沿路径向下寻找  这个过程叫做 捕获阶段，这个过程会走过  房子  冰箱 饭盒<span id="more-338"></span></p>
<p>第二步是目标阶段  即已经找到 食物了</p>
<p>第三步是冒泡阶段 FlashPlayer会沿原路向上回索 走的顺序是  饭盒 冰箱  房子</p>
<p>你可以理解成  捕获阶段是找出从顶级stage到目标食物之间的所有父子级包含关系</p>
<p>然后 找到目标了  ，携带着目标所发出的事件对象，</p>
<p>再根据捕获阶段找到的路 ，往回走，看看到底有哪些父级对象侦听了目标所发出的事件类型</p>
<p>上面的明白了 那你就很容易理解  target 和 currentTarget的区别了</p>
<p>target 就是目标对象   currentTarget 在事件流(冒泡阶段)中是不断变化的，依据是当时冒泡冒到哪一级对象</p>
<p>比如一个影片剪辑MC 里面有一个文本框TextField的话，我们为MC赋了侦听事件的话，</p>
<p>如果当时点击的范围在文本框上的话，target会指向这个文本框 而非添加侦听的MC，<br />
在事件发生之初 ，即在目标阶段时   traget == currentTarget的<br />
但因为会有冒泡事件 ，所以在事件冒泡到上级MC的时候，currentTarget 就等于MC了</p>
<p>但在整个事件流过程中，target是不变的 ，则哪一个显示对象发生的 ，target永远就是那个对象</p>
<p>最后我们再来看看相关的API知识 </p>
<p>public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void </p>
<p>我们平时用到的addEventListener其实它后边是有5个参数的 ，其中第一 第二个是最常用的 必须指定的参数，其它3个可根据情况使用 所以有默认值</p>
<p>type：即平时那些 MouseEvent.MOUSE_DOWN 之类的， 要侦听的事件类型<br />
listener：即事件的处理函数</p>
<p>useCapture：设置事件侦听的阶段，因为事件流机制是分成三个部分的 捕获 目标 冒泡 ，这个函数默认不指定是false ，即运作于 冒泡阶段的</p>
<p>有时候我们希望父级的侦听先于目标对象，即在捕获阶段就触发父级对象的侦听事件，就可以指定这个参数为true了，否则不指定就是false值</p>
<p>addEventListener(MouseEvent.MOUSE_DOWN, func_mouseDown , true)</p>
<p>后边两个参数不常用  第一个是设置事件的优先级 在多个事件同级的情况下 这个设置执行优先级<br />
第二个是设置处理函数的弱引用 ，  即 上面的 func_mouseDown ，是基于AVM2的内存清理机制 一般极少使用 不详释</p>
<p>另外 再补充两个属性的说明 </p>
<p>显示对象中 </p>
<p>InteractiveObject  &#8211; DisplayObject &#8211;  EventDispatcher &#8211; Object </p>
<p>可接受鼠标键盘的交互对象，它是有一个属性，名字是：mouseEnabled</p>
<p>前边已经说了，as3的显示列表 事件机制是 基于事件流的 </p>
<p>比如有时候 我们为子级和父级都侦听了事件  addEventListener ，但突然有需要屏蔽父级的事件侦听 </p>
<p>我们不可能每次都去removeEventListener的，这时候我们就可以通过设置父级的mouseEnabled = false   ，来临时屏蔽父级对象的事件侦听，需要的时候  mouseEnabled = true就可以马上重新侦听事件</p>
<p>另一个属性是 mouseChildren ，这个属性是影响子级对象的</p>
<p>比如我们平时如果事件处理中用到target的话，  比如我想用一个影片剪辑MC来做按钮的话</p>
<p>前面已经说过了 如果里面有文本的话，点击的时候 侦听事件中的traget有可能会指向这个TextField， 而非上级的MC，这样的话，就容易出错了</p>
<p>如果我们不想发生这样的错误 ，就可以设置 MC的 mouseChildren = false</p>
<p>來屏蔽子级对象的事件发生 ，即事件流过程，最后一级到达  MC 就不会再向下遍历的了</p>
<p>在这一级就马上转入目标阶段 转而再进入冒泡阶段</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/09/as3-even/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash CS5内置了物理引擎</title>
		<link>http://www.luoye.org/blog/2011/06/flash-cs5-ik/</link>
		<comments>http://www.luoye.org/blog/2011/06/flash-cs5-ik/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 14:31:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>
		<category><![CDATA[PhysicsManager]]></category>
		<category><![CDATA[物理引擎]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=324</guid>
		<description><![CDATA[安装Flash CS5这么久，才发现有内置了的物理引擎。在Flash CS5的安装目录下： C:\Program Files\Adobe\Adobe Flash CS5\Common\Configuration\ActionScript 3.0\libs 可以看到，那个名为“PffLib.swc”的类库就是物理引擎了。同时，还可以看到一个名为“11.0”的文件夹，不知道这个11.0是指flash player的版本还是另有它意。 详细信息和demo可以在国外原文上看到：http://heftybyte.com/?p=36 。有趣的是，那个作者在demo代码里起的变量名为“fuckAdobe”，然后加一个“WARNING”，大概意思是：“源码里有脏话，说了Adobe坏话，但这是由于连夜加班所致，我还是很爱Adobe的。”]]></description>
			<content:encoded><![CDATA[<p>安装Flash CS5这么久，才发现有内置了的物理引擎。在Flash CS5的安装目录下：</p>
<blockquote><p><em>C:\Program Files\Adobe\Adobe Flash CS5\Common\Configuration\ActionScript 3.0\libs</em></p></blockquote>
<p>可以看到，那个名为“PffLib.swc”的类库就是物理引擎了。同时，还可以看到一个名为“11.0”的文件夹，不知道这个11.0是指flash player的版本还是另有它意。</p>
<p>详细信息和demo可以在国外原文上看到：<a href="http://heftybyte.com/?p=36">http://heftybyte.com/?p=36</a> 。有趣的是，那个作者在demo代码里起的变量名为“fuckAdobe”，然后加一个“WARNING”，大概意思是：“源码里有脏话，说了Adobe坏话，但这是由于连夜加班所致，我还是很爱Adobe的。”<span id="more-324"></span></p>
<p><img title="flcs5_PffLib2" src="http://www.luoye.org/blog/wp-content/uploads/2011/06/flcs5_PffLib.gif" alt="" /></p>
<p><img title="flcs5_PffLib2" src="http://www.luoye.org/blog/wp-content/uploads/2011/06/flcs5_PffLib2.gif" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/flash-cs5-ik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>深入挖掘Molehill API的一些特征（Flash的真正3D）</title>
		<link>http://www.luoye.org/blog/2011/06/flash-molehill-api-3d/</link>
		<comments>http://www.luoye.org/blog/2011/06/flash-molehill-api-3d/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 13:41:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>
		<category><![CDATA[flash 3d]]></category>
		<category><![CDATA[flash player11]]></category>
		<category><![CDATA[Molehill]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=320</guid>
		<description><![CDATA[以后Flash Player真正的3D要来了。Molehill（一个代号而已）依靠Windows上的DirectX9、MacOS和Linux上的OpenGL1.3，在手机平台（比如Android）Molehill利用OpenGL ES2来渲染。从性能角度考虑，对于FlashPlayer10.1版本，渲染数千个没有Z轴深度缓冲的三角化物体接近30Hz；通过新的3D API，开发者在全屏高清环境下渲染数万个有Z轴深度缓冲的三角化物体频率能达到60Hz！在不支持GPU的计算机上，将由CPU取代。 关于Molehill的更详细解说： 英文版：http://www.bytearray.org/?p=2555 中文翻译版：http://tomyail.72pines.com/2011/01/09/digging_more_into_the_molehill_apis/]]></description>
			<content:encoded><![CDATA[<p>以后Flash Player真正的3D要来了。Molehill（一个代号而已）依靠Windows上的DirectX9、MacOS和Linux上的OpenGL1.3，在手机平台（比如Android）Molehill利用OpenGL ES2来渲染。从性能角度考虑，对于FlashPlayer10.1版本，渲染<strong>数千个没有Z轴深度缓冲</strong>的三角化物体接近30Hz；通过新的3D API，开发者在全屏高清环境下渲染<strong>数万个有Z轴深度缓冲</strong>的三角化物体频率能达到60Hz！在不支持GPU的计算机上，将由CPU取代。</p>
<p><strong>关于Molehill的更详细解说：</strong></p>
<ul>
<li>英文版：<a href="http://www.bytearray.org/?p=2555">http://www.bytearray.org/?p=2555</a></li>
<li>中文翻译版：<a href="http://tomyail.72pines.com/2011/01/09/digging_more_into_the_molehill_apis/">http://tomyail.72pines.com/2011/01/09/digging_more_into_the_molehill_apis/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/flash-molehill-api-3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Flash Player 11(11,0,1,3d)(Incubator build)</title>
		<link>http://www.luoye.org/blog/2011/06/adobe-flash-player-1111013dincubator-build/</link>
		<comments>http://www.luoye.org/blog/2011/06/adobe-flash-player-1111013dincubator-build/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 13:14:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=309</guid>
		<description><![CDATA[Flash Player 11.0.1.3 build 这个版本增加了一些非常实用的API，包括但不限于：内置了JSON解析和生成、垃圾回收通知、暂停/休眠/恢复的事件（特别适用于player失去焦点降帧的情况）。从下图可以看到，JSON类是顶级类，直接使用它的两个静态方法：parse() 和 stringify() 。 本次版本的新特性： （懒了，不翻译） Media/Real Time Communications G.711 audio compression for telephony — Support interoperability with legacy phone system (through Flash Media Gateway, FMG) and other third-party clients (through open RTMP protocol) without the need of transcoding. H.264/AVC SW Encode for camera encoding — Higher compression efficiency and wide [...]]]></description>
			<content:encoded><![CDATA[<p>Flash Player 11.0.1.3 build 这个版本增加了一些非常实用的API，包括但不限于：内置了JSON解析和生成、垃圾回收通知、暂停/休眠/恢复的事件（特别适用于player失去焦点降帧的情况）。从下图可以看到，JSON类是顶级类，直接使用它的两个静态方法：parse() 和 stringify() 。<span id="more-309"></span></p>
<p><img title="json_api" src="http://www.luoye.org/blog/wp-content/uploads/2011/06/json_api.png" alt="" width="905" height="257" /></p>
<h2>本次版本的新特性：</h2>
<p>（懒了，不翻译）</p>
<h4>Media/Real Time Communications</h4>
<ul>
<li><strong>G.711 audio compression for telephony</strong> — Support interoperability with legacy phone system (through Flash Media Gateway, FMG) and other third-party clients (through open RTMP protocol) without the need of transcoding.</li>
<li><strong>H.264/AVC SW Encode for camera encoding</strong> — Higher compression efficiency and wide industry for real-time communications and non-real time broadcast scenario, like web-casting, livecasting, etc.</li>
</ul>
<h4>Language/VM</h4>
<ul>
<li><strong>JSON (JavaScript Object Notation)</strong> — Enables Actionscript programmers to take advantage of fast parsing and generation of JSON-formatted text to represent their data. Take existing code written for the JSON interface provided by ECMAScript 5th edition and drop the code, with minimal or no modification, into an Actionscript project.</li>
<li><strong>GC Advice</strong> — Provides a simple facility with which AS3 code can advise the GC on when to schedule the disruptive end-of-GC pause.</li>
<li><strong>Socket Progress Events</strong> — Provide a means by which content can determine how many bytes remain in the AS Socket’s write buffer. Provide an event which will inform content whenever data is removed from the AS Socket’s write buffer so that it may easily monitor the status of the write buffer without having to set up a timer and manually poll the size remaining in the AS Socket’s write buffer.</li>
<li><strong>Pause/sleep/resume Events</strong> — Provide AS3 new event notifications by exposing an event to inform the content of the throttling, the content can send a message to the server so that server and client are kept in sync. For example when the Flash Player throttles the content (i.e. fps is reduced to 8, 4, 2 or 0 fps at a time when the content did not request this change).</li>
</ul>
<h4>Security</h4>
<ul>
<li><strong>Secure random number generator</strong> — Generate secure random numbers that are cryptographically as strong as the underlying operating system. Utilizing native OS APIs this feature will be used by Flash Player on the desktop and mobile platforms (Android) by Flash Platform Services.</li>
</ul>
<p><strong>详细请看</strong>：<a href="http://labs.adobe.com/technologies/flashplatformruntimes/incubator/">http://labs.adobe.com/technologies/flashplatformruntimes/incubator/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/06/adobe-flash-player-1111013dincubator-build/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用户数据跟踪之Flash Cookies</title>
		<link>http://www.luoye.org/blog/2011/01/user-flash-cookies/</link>
		<comments>http://www.luoye.org/blog/2011/01/user-flash-cookies/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 01:51:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>
		<category><![CDATA[Flash Cookies]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=273</guid>
		<description><![CDATA[一、什么是Flash Cookies？ Cookies是一种保存在电脑上的文本文件，它可以用来记录访客的登录ID、使用偏好、习惯，以便更好地为访客提供个性化服务、方便访客的使用。但是在客户端Cookie里保存数据是不稳定的，因为用户可能随时会清除掉浏览器的Cookie，在这种情况下就需要新的技术来替代Cookies以实现继续追踪用户。Adobe公司的Local Shared Object（Flash Cookies）技术就能轻易的实现这种追踪。新浪、搜狐、腾讯、淘宝、优酷等都在使用这种技术。 FlashCookie是由FlashPlayer控制的客户端共享存储技术，它具备以下特点：1、类似HTTP Cookie，Flash Cookie利用 SharedObject类实现本地存储信息，SharedObject类用于在用户计算机上读取和存储有限的数据量，共享对象提供永久贮存在用户计算机上的对象之间的实时数据共享；2、本地共享对象是作为一些单独的文件来存储的，它们的文件扩展名为.SOL；3、本地共享对象并不是基于浏览器的，所以普通的用户不容易删除它们。如果要删掉它们的话，首先要知道这些文件所在的具体位置。这使得本地共享对象能够长时间的保留在本地系统上。 二、Flash Cookies和Cookies有什么区别？ 1、存储大小不同 cookies仅允许存储4KB，而flash cookies则存储100KB—这只是默认的，还可以调整大小。 2、存储时长不同 一般来说，cookies是有消亡期的，它会在一段时间后自动消失；而flash cookies并不，如果你没有删除它，它就永远保留在你的电脑上。 3、存储位置不同 普通cookies的位置人们并不需要知道，因为他们可以通过许多软件进行删除，甚至浏览器本身都内置了这一功能。而flash cookies则是存储在C:\Documents and Settings\用户名\Application Data\Macromedia\Flash Player文件夹下。其中#sharedobjects文件夹用于存储flash cookies，macromedia.com存储flash cookies的全局设置。 三、如何使用Flash Cookies? 要实现Flash Cookie永远存储的功能，显然，首先要实现Flash Cookie与Http Cookie的互通，所以，在技术上使用JavaScript与ActionScript的来进行沟通显然是最好的选择，因为在这两种语言之间，除了语法上相近，从沟通上也有着完美的实现。下面我们来看看实现流程（如图所示）： ActionScript实现： 在明确了实现流程之后，那么接下来就是具体的实现了，首先是基础建设，在Flash端，我们使用的是ActionScript3来编程，下面实现了一个基本的Flash Cookies存储的类，在接下来的过程当中，我们将通过这个类来实现对Flash Cookies的操作。当然，这里只是把流程以及关键的技术讲清楚，涉及到具体的操作，则需要您自己来实现。 package laohan.flashcookie { //注：由于我没有装Flex，所以只好使用Flash CS3来嵌入。 //如果使用Flash Developer，则MovieClip这个包可以不包含。 import flash.display.MovieClip; import flash.net.SharedObject; import flash.external.ExternalInterface;   public class myFlashCookie extends [...]]]></description>
			<content:encoded><![CDATA[<p><strong>一、什么是Flash Cookies？</strong></p>
<p>Cookies是一种保存在电脑上的文本文件，它可以用来记录访客的登录ID、使用偏好、习惯，以便更好地为访客提供个性化服务、方便访客的使用。但是在客户端Cookie里保存数据是不稳定的，因为用户可能随时会清除掉浏览器的Cookie，在这种情况下就需要新的技术来替代Cookies以实现继续追踪用户。Adobe公司的Local Shared Object（Flash Cookies）技术就能轻易的实现这种追踪。新浪、搜狐、腾讯、淘宝、优酷等都在使用这种技术。<span id="more-273"></span></p>
<p><img title="flash-cookies-site" src="http://www.luoye.org/blog/wp-content/uploads/2011/01/flash-cookies-site.png" alt="" width="594" height="199" /></p>
<p>FlashCookie是由FlashPlayer控制的客户端共享存储技术，它具备以下特点：1、类似HTTP Cookie，Flash Cookie利用 SharedObject类实现本地存储信息，SharedObject类用于在用户计算机上读取和存储有限的数据量，共享对象提供永久贮存在用户计算机上的对象之间的实时数据共享；2、本地共享对象是作为一些单独的文件来存储的，它们的文件扩展名为.SOL；3、本地共享对象并不是基于浏览器的，所以普通的用户不容易删除它们。如果要删掉它们的话，首先要知道这些文件所在的具体位置。这使得本地共享对象能够长时间的保留在本地系统上。</p>
<p><strong>二、Flash Cookies和Cookies有什么区别？</strong></p>
<p>1、存储大小不同 cookies仅允许存储4KB，而flash cookies则存储100KB—这只是默认的，还可以调整大小。</p>
<p>2、存储时长不同 一般来说，cookies是有消亡期的，它会在一段时间后自动消失；而flash cookies并不，如果你没有删除它，它就永远保留在你的电脑上。</p>
<p>3、存储位置不同 普通cookies的位置人们并不需要知道，因为他们可以通过许多软件进行删除，甚至浏览器本身都内置了这一功能。而flash cookies则是存储在C:\Documents and Settings\用户名\Application Data\Macromedia\Flash Player文件夹下。其中#sharedobjects文件夹用于存储flash cookies，macromedia.com存储flash cookies的全局设置。</p>
<p><strong>三、如何使用Flash Cookies?</strong></p>
<p>要实现Flash Cookie永远存储的功能，显然，首先要实现Flash Cookie与Http Cookie的互通，所以，在技术上使用JavaScript与ActionScript的来进行沟通显然是最好的选择，因为在这两种语言之间，除了语法上相近，从沟通上也有着完美的实现。下面我们来看看实现流程（如图所示）：</p>
<p><img title="flash-cookies" src="http://www.luoye.org/blog/wp-content/uploads/2011/01/flash-cookies.jpg" alt="" width="523" height="307" /></p>
<p><strong>ActionScript实现：</strong></p>
<p>在明确了实现流程之后，那么接下来就是具体的实现了，首先是基础建设，在Flash端，我们使用的是ActionScript3来编程，下面实现了一个基本的Flash Cookies存储的类，在接下来的过程当中，我们将通过这个类来实现对Flash Cookies的操作。当然，这里只是把流程以及关键的技术讲清楚，涉及到具体的操作，则需要您自己来实现。</p>
<div>
<div>
<pre class="brush: as3; title: ;">package laohan.flashcookie {  //注：由于我没有装Flex，所以只好使用Flash CS3来嵌入。  //如果使用Flash Developer，则MovieClip这个包可以不包含。  import flash.display.MovieClip;  import flash.net.SharedObject;  import flash.external.ExternalInterface;     public class myFlashCookie extends MovieClip {//如果使用Flex，可以不继承这个类。  private var cookieTimeOut:uint;  private var cookieName:String;  private var cookieSharedObj:SharedObject;  private var currentCookie:Object;  private var cookieValue:String;     //构造函数。  public function myFlashCookie(cName:String = &quot;handaoliang&quot;, timeOut:uint=3600) {  cookieName = cName;  cookieTimeOut = timeOut;  cookieSharedObj = SharedObject.getLocal(cName, &quot;/&quot; );  if(isCookieExist(cName)){//如果FlashCookies存在。  currentCookie = getCookies(cName);  //调用JavaScript里的jsSetCookies方法来设置HTTPCookie  ExternalInterface.call(&quot;jsSetCookies&quot;,{fcookie:currentCookie});  //trace(currentCookie);  }  }  //到期删除Cookies  public function clearTimeOut():void {  var obj:* = cookieSharedObj.data.cookie;  if(obj == undefined){  return;  }  for(var key in obj){  if(obj[key] == undefined || obj[key].time == undefined || isTimeOut(obj[key].time)){  delete obj[key];  }  }  cookieSharedObj.data.cookie = obj;  cookieSharedObj.flush();  }  //添加Cookies( key-value )  public function saveCookies(key:String, value:*):void {  var today:Date = new Date();  key = &quot;key_&quot;+key;  value.time = today.getTime();  if(cookieSharedObj.data.cookie == undefined){  var obj:Object = {};  obj[key] = value;  cookieSharedObj.data.cookie = obj;  }else{  cookieSharedObj.data.cookie[key] = value;  }  cookieSharedObj.flush();  }  //删除当前Cookies  public function removeCookies(key:String):void {  if (isCookieExist(key)) {  delete cookieSharedObj.data.cookie[&quot;key_&quot; + key];  cookieSharedObj.flush();  }  }  //通过Key来获取Cookies值。  public function getCookies(key:String):Object{  return isCookieExist(key)?cookieSharedObj.data.cookie[&quot;key_&quot;+key]:null;  }  //检查Cookies是否存在。  public function isCookieExist(key:String):Boolean{  key = &quot;key_&quot; + key;  return cookieSharedObj.data.cookie != undefined &amp;amp;&amp;amp; cookieSharedObj.data.cookie[key] != undefined;  }  //检查Cookies的到期时间  private function isTimeOut(time:uint):Boolean {  var today:Date = new Date();  return time + cookieTimeOut * 1000 &amp;lt; today.getTime();  }  //取得Cookies的到期时间;  public function getTimeOut():uint {  return cookieTimeOut;  }  //取得Cookies名称。  public function getName():String {  return cookieName;  }  //清除所有的Cookies值。  public function clearCookies():void {  cookieSharedObj.clear();  }  }  }</pre>
</div>
</div>
<p>将所有的模块编译成SWF文件，我们将其命名为：hdl.swf，在上面的代码中，我们首先在构造函数里检查了Flash Cookie是否存在，如果存在，则会调用一个叫jsSetCookies的JavaScript方法来设置HTTP Cookie。那么，我们接下来要使用JavaScript来实现此SWF的调用以及互动。</p>
<p>JavaScript的实现：</p>
<p>1）首先要预定义一个供ActionScript3调用的方法，即上面说过的jsSetCookies方法。</p>
<div>
<div>
<pre>//先定义一个全局变量  var flashCookiesValue = Null;  var jsSetCookies = function(flahCookieValue){  var o = arguments[0];  flashCookiesValue = o.fcookie;//在SWF执行时传递过来的值。  document.cookie="handaoliang="+flashCookiesValue+";path=/;expires=Fri, 04-Dec-2009 08:44:07 GMT;domain=handaoliang.com";  };</pre>
</div>
</div>
<p>2）检查特定的HTTPCookies是否存在，如果不存在，则在页面上生成Object Dom节点，把hdl.swf加载进来。此时SWF会去检查Flash Cookies是否存在，如果存在，则去取得Flash Cookies，并且通过调用jsSetCookies来设置HTTP Cookies：</p>
<div>
<div>
<pre class="brush: plain; title: ;">if(document.cookie.indexOf(&quot;handaoliang=&quot;) &amp;lt; 0){      //先去load hdl.swf，即在页面上生成Object对象：      var jsLoadFlash = function(){          var myFlashURL = &quot;hdl.swf&quot;;          var myFlashObj = document.createElement(&quot;object&quot;);          myFlashObj.setAttribute(&quot;id&quot;,&quot;myFlash&quot;);          myFlashObj.setAttribute(&quot;classid&quot;,&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot;);          myFlashObj.setAttribute(&quot;width&quot;,0);          myFlashObj.setAttribute(&quot;height&quot;,0);          var flahParamObj = document.createElement(&quot;param&quot;);          flahParamObj.setAttribute(&quot;name&quot;,&quot;movie&quot;);          flahParamObj.setAttribute(&quot;value&quot;,myFlashURL);             var subMyFlashObj = document.createElement(&quot;object&quot;);          subMyFlashObj.setAttribute(&quot;type&quot;,&quot;application/x-shockwave-flash&quot;);          subMyFlashObj.setAttribute(&quot;data&quot;,myFlashURL);          subMyFlashObj.setAttribute(&quot;width&quot;,0);          subMyFlashObj.setAttribute(&quot;height&quot;,0);             myFlashObj.appendChild(flahParamObj);          myFlashObj.appendChild(subMyFlashObj);             var myDHTMLBody = document.body;          if(myDHTMLBody){              myDHTMLBody.appendChild(myFlashObj);          }      };      jsLoadFlash();  }</pre>
</div>
</div>
<p>倘若Flash Cookies里也没有存储我们想要的数据呢？那么，此时就必须通过JS去请求特定的URL，然后使用JavaScript去调用AS3的方法来设置Flash Cookies吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2011/01/user-flash-cookies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>as3传ByteArray,PHP接二进制文件</title>
		<link>http://www.luoye.org/blog/2010/12/as3-bytearray-php/</link>
		<comments>http://www.luoye.org/blog/2010/12/as3-bytearray-php/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 08:40:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ATIONSCRIPT]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[ByteArray]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.luoye.org/blog/?p=259</guid>
		<description><![CDATA[Flex,flash端： var request:URLRequest = new URLRequest(&#34;phpurl&#34;); request.data = byteArray;//传入的ByteArray数据  request.method = URLRequestMethod.POST; //传入方式为post request.contentType = &#34;application/octet-stream&#34;; var loader:URLLoader = new URLLoader(); loader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler); loader.addEventListener(Event.COMPLETE,urlLoadCompleteHandler); loader.addEventListener(ProgressEvent.PROGRESS,progressHandler); loader.load(request);   php端： PHP默认只识别application/x-www.form-urlencoded标准的数据类型。 因此，对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析，如果用$_POST数组来接收就会失败！ 故保留原型，交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。 另外还有一项 php://input 也可以实现此这个功能 php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来，它给内存带来的压力较小，并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype=&#8221;multipart/form-data&#8221;。 我在Flash中使用JPGEncoder把BitMapData转成二进制，然后post给php php页面代码如下： &#60;?php $filename=&#34;teststream.jpg&#34;;//要生成的图片名字 $xmlstr [...]]]></description>
			<content:encoded><![CDATA[<p>Flex,flash端：</p>
<pre class="brush: as3; title: ;">
var request:URLRequest = new URLRequest(&quot;phpurl&quot;);
request.data = byteArray;//传入的ByteArray数据 
request.method = URLRequestMethod.POST; //传入方式为post
request.contentType = &quot;application/octet-stream&quot;;
var loader:URLLoader = new URLLoader();
loader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
loader.addEventListener(Event.COMPLETE,urlLoadCompleteHandler);
loader.addEventListener(ProgressEvent.PROGRESS,progressHandler);
loader.load(request);</pre>
<p><span id="more-259"></span><br />
 </p>
<p>php端：</p>
<p>PHP默认只识别application/x-www.form-urlencoded标准的数据类型。<br />
因此，对型如text/xml 或者 soap 或者 application/octet-stream 之类的内容无法解析，如果用$_POST数组来接收就会失败！<br />
故保留原型，交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。</p>
<p>另外还有一项 php://input 也可以实现此这个功能</p>
<p>php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来，它给内存带来的压力较小，并且不需要任何特殊的 php.ini 设置。php://input和 $HTTP_RAW_POST_DATA 不能用于 enctype=&#8221;multipart/form-data&#8221;。</p>
<p>我在Flash中使用JPGEncoder把BitMapData转成二进制，然后post给php</p>
<p>php页面代码如下：</p>
<pre class="brush: php; title: ;">
&lt;?php
$filename=&quot;teststream.jpg&quot;;//要生成的图片名字

$xmlstr =  $GLOBALS[HTTP_RAW_POST_DATA];
if(empty($xmlstr)) $xmlstr = file_get_contents('php://input');

$jpg = $xmlstr;//得到post过来的二进制原始数据
$file = fopen(&quot;upload/&quot;.$filename,&quot;w&quot;);//打开文件准备写入
fwrite($file,$jpg);//写入
fclose($file);//关闭
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.luoye.org/blog/2010/12/as3-bytearray-php/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

