- 浏览: 1088073 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (695)
- 心情日记 (14)
- AS开发工具 (12)
- 文章转载 (99)
- AIR (5)
- 问题总结 (46)
- SWF格式 (7)
- 测试总结 (10)
- 外文资料 (9)
- 算法技术 (33)
- AS3常用开源库 (43)
- 源码范例 (102)
- FLEX (72)
- FLASH 优化 (33)
- 游戏开发 (49)
- 开发技术 (11)
- 工作应用 (34)
- AS3收集 (140)
- WebBase (0)
- 开发构想 (4)
- 设计模式 (2)
- 框架和框架范例 (19)
- RED5 (3)
- java开发 (3)
- JAVA (1)
- FLASH-3D (23)
- 3D (6)
- 书籍 (10)
- 业界信息资料 (3)
- C# (1)
- JavaScript (12)
- HTML5 (6)
- Flixel (1)
- D5Power RPG网页游戏引擎 (0)
- ColorMatrixFilter - 获得相应颜色的色调 函数 (0)
- Starling (0)
最新评论
-
老顽童203:
字体
水果忍者鼠标跟随特效制作[转载] -
hairball00:
[转] 放出超多的Flash组件源代码 -
he74552775:
flash AS3 RegExp简单功能用法(转) -
hanshuai1232000:
第四点,有利也有弊,等你做了大型的aprg,你就知道了
[转]位图数据内存优化 -
yangfantao:
太感谢
[转] 放出超多的Flash组件源代码
http://bbs.9ria.com/viewthread.php?tid=76876&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000
嵌入式资源
另一个常用功能就是嵌入外部资源(XML或者Pixel Bender Kernel 滤镜)时会用到.我们经常会碰到的问题就是将那些运行时依赖的资源嵌入到外部swf中.一些服务端拒绝swf拥有外部依赖(external dependency),所以假设你开发了一个小型的应用或游戏并且在几分钟后你需要快速的删除所有外部依赖(external dependency),你可以使用Embed标签来实现这一功能.
在下面的代码中,我们使用Embed标签来嵌入一个外部的 Pixel Bender 滤镜
在编译时, Pixel Bender 滤镜将被当做一个ByteArray嵌入,注意mimeType application/octet-stream的用途就是允许嵌入资源被当做ByteArray.
更一般的我们也可以将XML作为嵌入资源:
任何东西都可以通过这种方法嵌入,我们通过bytearray的API来操作这里嵌入的原始二进制数据 .但需要强调的是上一段代码有一点冗余,所以我们可以通过使用特定的mimeType,来强制的要求转码器将其映射为特定的类型.在下列的代码中,你会看到同样的嵌入使用mimeType后代码变得极其简单.
很便捷吧?接下来让我们来了解一下怎么样在运行时注入和重建bytes的内容.Adobe Flash Player 提供了一个非常强大的API来处理这种情景.
注入bytes
一般来说注入的对象可以是图像,字体,甚至是swf.Flash player 中没有SWF类型,但是你猜怎么着?Loader对象的API中有一个loadBytes.
这就是允许我们将swf当做一个ByteArray注入到Loader对象中并可以运行它:
为了显示它,我们只需要将Loader添加到显示列表即可:
复制代码
对于图像或者声音,你甚至不需要设定mimeType.转码器不需要任何干预就可以自动将stream映射成正确的类型.
让我们再深入了解一下图像,在下面的部分我们将会用一种新的方法来动态加载图像.
图像的渐进式加载
Flash player中另一个和byte相关的强大API叫做:URLStream,这个API允许我们在FLash player中下载东西并可以访问已下载的内容.其形式如同一个由服务器推送数据的soket一样.
让我们来看下面的代码:
我们可以看到 ProgressEvent.PROGRESS 事件被广播了多次,Event.COMPLETE 事件在结束时被广播了一次.
但是当一些数据被下载后你的确是可以通过loader发送给你的数据来访问他们.在这一过程中你还以通过一个对象得知当前已加载量和总加载量.
让我们在前一段代码的基础上做一些修改.
现在我们会将当前已加载的字节以字符串的形式读取出.你应该会在output窗口看到原始google页面的html代码.如下所示:
这就意味着我们的逐步的读取字节.这一有趣的特点造就了我们的下一个实例,在加载完毕前通过尽快的解析图像(字节)中的头部(head)信息来重现图像.
我们通过API loadBytes来显示接收到的数据,当我们插入新的字节数据时,FLash Player显示出了其内容.下图展示出了一张未加载完的图像.
然后图像逐步显示直至最终加载完成
现在你可能不太清楚其真正的价值,但是这一实例的确很好的告知了我们可以用URLStream接收到的数据来干什么.就像我们刚刚看到的,loadBytes是一个非常强大的API但是它也有自身的限制.在接下来的部分我们将去探寻为什么有些时候开发者被其困住了.
Loadbytes 的局限性
要记住loadBytes是异步的,所以需要我们需要等到Event.COMPLETE事件之后才可以读取swf的大小,class定义等.下面的代码说明了这一大意:
只有当加载完毕后类定义才可以被获取到:
在loader对象中的所有种类的文件都必遵从这个限制.有很多开发者企图在加载过程中动态读取一个图像,但是在我们现有的RSL(动态运行时共享库)机制下,图像相关数据的读取必须要等到加载完毕后才可以进行,并且图像的解析是由Flash player进行的:
因此你也需要一个异步的处理方法.在加载过程中你需要手动的来解析.为此我用 adobe的 Alchemy 写过一个动态的JPEG解码器 (http://www.bytearray.org/?p=1089)
嵌入式资源
另一个常用功能就是嵌入外部资源(XML或者Pixel Bender Kernel 滤镜)时会用到.我们经常会碰到的问题就是将那些运行时依赖的资源嵌入到外部swf中.一些服务端拒绝swf拥有外部依赖(external dependency),所以假设你开发了一个小型的应用或游戏并且在几分钟后你需要快速的删除所有外部依赖(external dependency),你可以使用Embed标签来实现这一功能.
在下面的代码中,我们使用Embed标签来嵌入一个外部的 Pixel Bender 滤镜
[Embed(source="myFilter.pbj", mimeType="application/octet-stream")] var myShaderKernel:Class;
在编译时, Pixel Bender 滤镜将被当做一个ByteArray嵌入,注意mimeType application/octet-stream的用途就是允许嵌入资源被当做ByteArray.
更一般的我们也可以将XML作为嵌入资源:
import flash.utils.ByteArray; [Embed(source="test.xml", mimeType="application/octet-stream")] var xmlStream:Class; // instanciate the stream as a ByteArray var xmlBytes:ByteArray = new xmlStream(); // read the XML String from the byte stream var xmlString:String = xmlBytes.readUTFBytes( xmlBytes.bytesAvailable ); // instanciate a XML object by passing the content var myXML:XML = new XML(xmlString); /* outputs : <menu> <item/> <item/> <item/> </menu> */ trace ( myXML ); // outputs : 3 trace ( myXML.item.length() );
任何东西都可以通过这种方法嵌入,我们通过bytearray的API来操作这里嵌入的原始二进制数据 .但需要强调的是上一段代码有一点冗余,所以我们可以通过使用特定的mimeType,来强制的要求转码器将其映射为特定的类型.在下列的代码中,你会看到同样的嵌入使用mimeType后代码变得极其简单.
import flash.utils.ByteArray; [Embed(source="test.xml", mimeType="text/xml")] var xmlStream:Class; // instanciate a XML object by passing the content var myXML:XML = new XML (xmlStream.data); /* outputs : <menu> <item/> <item/> <item/> </menu> */ trace ( myXML ); // outputs : 3 trace ( myXML.item.length() );
很便捷吧?接下来让我们来了解一下怎么样在运行时注入和重建bytes的内容.Adobe Flash Player 提供了一个非常强大的API来处理这种情景.
注入bytes
一般来说注入的对象可以是图像,字体,甚至是swf.Flash player 中没有SWF类型,但是你猜怎么着?Loader对象的API中有一个loadBytes.
这就是允许我们将swf当做一个ByteArray注入到Loader对象中并可以运行它:
import flash.utils.ByteArray; import flash.display.Loader; [Embed(source="test-loading.swf", mimeType="application/octet-stream")] var swfStream:Class; // instanciate the stream as a ByteArray var swfBytes:ByteArray = new swfStream(); // instanciate a Loader var myLoader:Loader = new Loader(); // inject the embedded stream inside the Loader // the SWF is executed automatically myLoader.loadBytes(swfBytes);
为了显示它,我们只需要将Loader添加到显示列表即可:
import flash.utils.ByteArray; import flash.display.Loader; [Embed(source="test-loading.swf", mimeType="application/octet-stream")] var swfStream:Class; // instanciate the stream as a ByteArray var swfBytes:ByteArray = new swfStream(); // instanciate a Loader var myLoader:Loader = new Loader(); // show the Loader object addChild ( myLoader ); // inject the embedded stream inside the Loader // the SWF is executed automatically What can you do with bytes ? – Chapter 2 – Everyday bytes myLoader.loadBytes(swfBytes);
复制代码
对于图像或者声音,你甚至不需要设定mimeType.转码器不需要任何干预就可以自动将stream映射成正确的类型.
import flash.utils.ByteArray; import flash.display.Bitmap; [Embed(source="ferrari-demo.png")] var myImageStream:Class; // instanciate the image as a classic Bitmap instance var myImage:Bitmap = new myImageStream(); // show it! addChild ( myImage );
让我们再深入了解一下图像,在下面的部分我们将会用一种新的方法来动态加载图像.
图像的渐进式加载
Flash player中另一个和byte相关的强大API叫做:URLStream,这个API允许我们在FLash player中下载东西并可以访问已下载的内容.其形式如同一个由服务器推送数据的soket一样.
让我们来看下面的代码:
// creates a URLStream object var stream:URLStream = new URLStream(); // listen to the ProgressEvent.PROGRESS event to grab the incoming bytes stream.addEventListener ( ProgressEvent.PROGRESS, onProgress ); stream.addEventListener ( Event.COMPLETE, onComplete ); // download the google.com index page stream.load ( new URLRequest ("http://www.google.com" ) ); function onProgress ( e:ProgressEvent ):void { trace ("progress"); } function onComplete ( e:Event ):void { trace ("complete"); }
我们可以看到 ProgressEvent.PROGRESS 事件被广播了多次,Event.COMPLETE 事件在结束时被广播了一次.
但是当一些数据被下载后你的确是可以通过loader发送给你的数据来访问他们.在这一过程中你还以通过一个对象得知当前已加载量和总加载量.
让我们在前一段代码的基础上做一些修改.
现在我们会将当前已加载的字节以字符串的形式读取出.你应该会在output窗口看到原始google页面的html代码.如下所示:
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859- 1"><title>Google</title><script>window.google={kEI:"xTp8TZq4HpPWtQOd4Kz4Ag",kEXPI:"28479,28501,28595,29014,291 35,29265,29279",kCSI:{e:"28479,28501,28595,29014,29135,29265,29279",ei:"xTp8TZq4HpPWtQOd4Kz4Ag",expi:"28479,28 501,28595,29014,29135,29265,29279"},ml:function(){},kHL:"en",time:function(){return(new Date).getTime()},log:function(c,d, b){var a=new Image,e=google,g=e.lc,f=e.li;a.onerror=(a.onload=(a.onabort=function(){delete g[f]}));g[f]=a;b=b||"/gen_204?atyp=i&ct="+c+"&cad="+d+"&zx="+google.time();a.src=b;e.li=f+1},lc:[],li:0,Toolbe lt:{}…
这就意味着我们的逐步的读取字节.这一有趣的特点造就了我们的下一个实例,在加载完毕前通过尽快的解析图像(字节)中的头部(head)信息来重现图像.
// creates a URLStream object var stream:URLStream = new URLStream(); // listen to the ProgressEvent.PROGRESS event to grab the incoming bytes stream.addEventListener ( ProgressEvent.PROGRESS, onProgress ); stream.addEventListener ( Event.COMPLETE, onComplete ); // download the remote image stream.load ( new URLRequest ("http://dl.dropbox.com/u/7009356/IMG_4958.jpg" ) ); // store the incoming bytes var buffer:ByteArray = new ByteArray(); // Loader to display the picture var loader:Loader = new Loader(); // show it addChild ( loader ); function onProgress ( e:ProgressEvent ):void { // we keep writing the bytes coming in stream.readBytes ( buffer, buffer.length ); // we clear the previously loaded content loader.unload(); // we inject the bytes to display the image loader.loadBytes ( buffer ); } function onComplete ( e:Event ):void { trace ("complete"); }
我们通过API loadBytes来显示接收到的数据,当我们插入新的字节数据时,FLash Player显示出了其内容.下图展示出了一张未加载完的图像.
然后图像逐步显示直至最终加载完成
现在你可能不太清楚其真正的价值,但是这一实例的确很好的告知了我们可以用URLStream接收到的数据来干什么.就像我们刚刚看到的,loadBytes是一个非常强大的API但是它也有自身的限制.在接下来的部分我们将去探寻为什么有些时候开发者被其困住了.
Loadbytes 的局限性
要记住loadBytes是异步的,所以需要我们需要等到Event.COMPLETE事件之后才可以读取swf的大小,class定义等.下面的代码说明了这一大意:
import flash.utils.ByteArray; import flash.display.Loader; [Embed(source="library.swf", mimeType="application/octet-stream")] var library:Class; // instanciate the stream as a ByteArray var swfBytes:ByteArray = new library(); // instanciate a Loader var myLoader:Loader = new Loader(); // show the Loader object addChild ( myLoader ); // loadBytes is asynchronous, we need to wait for the complete event before retrieving content from the loaded SWF myLoader.contentLoaderInfo.addEventListener ( Event.COMPLETE, onComplete ); // inject the embedded stream inside the Loader // the SWF is executed automatically myLoader.loadBytes(library); // handler function onComplete ( e:Event ):void { trace("loading complete"); }
只有当加载完毕后类定义才可以被获取到:
// handler function onComplete ( e:Event ):void { // retrieve a class definition var classDefinition:Class = e.currentTarget.applicationDomain.getDefinition("MyDefinition"): }
在loader对象中的所有种类的文件都必遵从这个限制.有很多开发者企图在加载过程中动态读取一个图像,但是在我们现有的RSL(动态运行时共享库)机制下,图像相关数据的读取必须要等到加载完毕后才可以进行,并且图像的解析是由Flash player进行的:
import flash.utils.ByteArray; import flash.display.Loader; [Embed(source="image.jpeg", mimeType="application/octet-stream")] var imageStream:Class; // instanciate the stream as a ByteArray var jpegBytes:ByteArray = new imageStream(); // instanciate a Loader var myLoader:Loader = new Loader(); // show the Loader object addChild ( myLoader ); // loadBytes is asynchronous, we need to wait for the complete event before retrieving image dimensions What can you do with bytes ? – Chapter 2 – Everyday bytes myLoader.contentLoaderInfo.addEventListener ( Event.COMPLETE, onComplete ); // inject the image stream inside the Loader myLoader.loadBytes(jpegBytes); // handler retrieving the image size function onComplete ( e:Event ):void { // outputs : width : 300 height : 400 trace ( "width : " + e.currentTarget.width, "height : " + e.currentTarget.height ); }
因此你也需要一个异步的处理方法.在加载过程中你需要手动的来解析.为此我用 adobe的 Alchemy 写过一个动态的JPEG解码器 (http://www.bytearray.org/?p=1089)
发表评论
-
HttpStatusConfig --一个HTTP 协议返回的 解析说明类
2012-04-18 16:40 0package guwanyuan.qicool.game ... -
HTTP/1.1协议规范(中文归纳版)
2012-04-18 16:39 2131一、介绍(introduction) ... -
[转] [Flash/Flex] 加载SWF性能VS影片剪辑性能
2012-03-15 22:29 0http://bbs.9ria.com/viewthread. ... -
关于富士通windows 7家庭普通板升级为windows 7旗舰版
2012-03-05 14:51 2025windows7普通家庭版不能一下升级到windows7旗舰版 ... -
水果忍者鼠标跟随特效制作[转载]
2012-03-01 16:06 2456实现这效果其实比较简单,主要是思路~! package ... -
请问如何才能让加载到一半的SWF不自动播放
2012-02-29 03:06 1546我用loader加载l=new Loader(); ... -
禁止输入文本可以粘贴
2012-02-10 13:15 2322//禁止输入文本粘贴动作 private static ... -
江湖情缘游戏里的跳的类
2012-02-08 23:55 0package com.app.role.montions ... -
[教程] 路点导航(Waypoint Navigation)
2011-12-31 00:51 0前言:这个不难,所以知道的童鞋不要喷,不知道的童鞋也不要怕,要 ... -
ARPG游戏引擎设计思路
2011-12-31 00:48 00.整体结构 下载 (32.92 KB ... -
Embed绑定XML与txt文本文件
2011-12-28 15:54 4655使用Embed标签可以将图片绑定到swf中并显示,那么我 ... -
Flash_Rich_Text_Editor(完美的富文本编辑器)
2011-12-27 17:55 0Flash_Rich_Text_Editor(完美的富文 ... -
弹弹堂测试
2011-12-08 04:21 0弹弹堂测试弹弹堂测试 -
一些DEMO
2011-11-28 17:42 0一些DEMO一些DEMO -
Matrix学习
2011-11-28 16:51 0Matrix学习 -
[转]三次贝尔曲线
2011-11-10 01:09 1931http://bbs.9ria.com/viewt ... -
[心得] 完美解决as3在ie中初始化时stageWidth和stageHeight为0的问题
2011-11-03 00:46 2943先看下面的一段脚本,这是比较经典的初始化脚本: pa ... -
五子棋算法详解
2011-10-31 04:14 0五子棋算法详解五子棋算法详解五子棋算法详解 -
[转]服务器端ActionScript语言参考
2011-10-31 00:29 0服务器端ActionScript语言参考 -
[转]FLASH与JS序列简单应用
2011-10-28 01:03 2095FLASH与JS序列简单应用 (一) 用swfob ...
相关推荐
<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>Example_1</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>...
一个本地播放器的源码,学习学习 ... <content>[This value will be overwritten by Flex Builder in the output app.xml]</content> <visible>true</visible> </initialWindow> </application>
附件是关于 Flash/Flex 几个重要框架 Cairngorm、Mate、PureMVC以及Swiz 的典型例子,由 Tony Hillerson 提供 Homepage: http://insideria.com
根据提供的文件信息,我们可以深入探讨FLEX中的_HTTPService组件及其使用方法。此组件主要用于与Web服务进行通信,例如从服务器获取或发送数据。下面将详细解释如何使用_HTTPService组件,并通过示例代码来展示其...
### 构建全栈式Flex、BlazeDS和Spring集成解决方案——第二部分:编写to-do list服务器端 #### 概述 本篇文章是构建全栈式Flex、BlazeDS和Spring集成解决方案系列的第二部分,重点在于搭建to-do list应用程序的...
<li><ahref="#heroes">感动人物</a></li> <li><ahref="#moments">动人瞬间</a></li> <li><ahref="#videos">感人视频</a></li> <li><ahref="#gallery">感动图集</a></li> <li><ahref="#news">感动新闻</a></li> ...
### Flex ItemRenderer 的详细教程 #### 一、ItemRenderer 概述 在 Flex 开发中,ItemRenderer 是一种非常强大的工具,它允许开发者自定义列表(List)、数据网格(DataGrid)等控件中每一项的外观和行为。通过 ...
ActionScript <br> HTML / JavaScript / CSS / Ajax <br> PDF 可嵌入任何应用程序中 <br>作为结果,AIR 应用程序可以是:<br><br> 基于Flash 或 Flex:应用程序根内容(理解为容器)为Flash/Flex (SWF) <br> 基于...
在IT行业中,Flash和Flex是曾经非常流行的富互联网应用程序(RIA)开发框架,它们主要用于创建交互式的网页内容和应用程序。本文将重点讲解如何在Flash或Flex项目中利用CSS(层叠样式表)来定义文本样式,提升用户...
`<mainSWF>`指定了应用的主SWF文件,这是Flex编译生成的ActionScript代码和资源的容器。 `<icon>`定义了应用的图标,可以为不同分辨率和操作系统指定不同尺寸的图标。 `<initialWindow>`配置了应用启动时的第一个...
<label for="message">留言:</label> <textareaid="message"name="message"></textarea><br><br> <buttontype="submit">提交</button> </form> </section> </main> <!-- 底部版权信息 --> <footer> <p>©2023 ...
在IT行业中,Flash/Flex是一种基于ActionScript编程语言和Adobe Flex框架的开发工具,用于创建交互式的、富媒体的Web应用程序。"Flash/Flex画曲线,绘图板"这个主题涉及的是如何使用这些技术来创建一个允许用户自由...
《构建基于Flex、GeoServer和OpenScales的地理信息系统平台》 在当今的GIS(地理信息系统)领域,灵活且功能强大的Web地图服务是至关重要的。本文将详细介绍如何使用Flex、GeoServer和OpenScales构建一个这样的平台...
Flex版本的简单标绘Plot是一种基于Adobe Flex技术的图形绘制工具,主要应用于数据可视化和地理信息系统(GIS)中。Flex是ActionScript 3.0的一个框架,它为创建富互联网应用程序(RIA)提供了强大的支持,特别是在...
<br>Feature highlight: Date object<br>View the time with this clock.<br> <br>Feature highlight: getTimer<br>An example of how you can build a stopwatch-style timer.<br> <br>Feature highlight: Dynamic ...
在IT行业中,Flash/Flex是一种广泛使用的开发工具,主要用于创建交互式、富媒体的Web应用程序。Flex是基于ActionScript和MXML的开放源代码框架,它允许开发者构建可自定义的用户界面,而Flash则是其背后的动画和...
以下是一个用Flex布局的柱状图: ... <div><div>10</div></div> <div><div>8</div></div> <div><div>15</div></div> <div><div>12</div></div> <div><div>5</div></div> </div> </div> CSS: .his_box{ /*盒子
在嵌入式系统设计中,通信接口的选择与配置至关重要,其中控制器局域网络(Controller Area Network,简称CAN)是一种广泛应用的串行通信协议,尤其在汽车电子和工业自动化领域。MM32系列微控制器,由Microchip ...
### Maven构建全栈式Flex、BlazeDS和Spring集成解决方案——第三部分:整合全部应用 #### 知识点概述 本篇文章将详细介绍如何利用Maven工具链构建一个完整的Flex、BlazeDS和Spring集成解决方案。文章分为三个部分...