针对有网友说看不见文章内容, 现提示如下: 点击每一个标题行任一地方都会展开和隐藏此文章内容(不要点击标题). 目前展开隐藏功能只支持IE浏览器,虽然可以改成支持FF浏览器,不过现在一直没时间去弄,等有时间再修改了。 |
blog名称:乱闪Blog 日志总数:267 评论数量:1618 留言数量:-26 访问次数:2657375 建立时间:2005年1月1日 |
|

| |
Flash MX 认证考试(样题)
|
来源: 未知
作者: cabxyz
更新日期: [2005-03-12]
1. Flash MX 不可以在Macintosh 平台上运行。 □ A. 正确 □ B. 错误 2. Flash 影片频率最大可以设置到多少? □ A. 99 □ B. 100 □ C. 120 □ D. 150 3. FListBox.addItem 和FListBox.addItemAt 有什么用 □ A. 添加列表框 □ B. 使用Value(值)对话框添加项目 □ C. 添加下拉菜单 □ D. 给组合框添加项目 4. Library 中有一元件Symbol 1,舞台上有一个该元件的实例。现通过实例属性检查器将该实 例的颜色改为#FF0033,透明度改为80%。请问此时Library 中的Symbol 1 元件将会发生什么 变化? □ A. 颜色也变为#FF0033 □ B. 透明度也变为80% □ C. 颜色变为#FF0033,透明度变为80% □ D. 不会发生任何改变 5. 编辑位图图像时,修改的是: □ A. 像素 □ B. 曲线 □ C. 直线 □ D. 网格 6. 单击View>Hide Edges 的作用是: □ A. 隐藏被选择对象的突出显示状态 □ B. 隐藏被选择对象的外框轮廓 □ C. 隐藏被选择对象的填充区域 □ D. 隐藏被选择对象的线条 7. 当Flash 导出较短小的事件声音(例如按钮单击的声音)时,最适合的压缩选项是: □ A. ADPCM 压缩选项 □ B. MP3 压缩选项 □ C. Speech 压缩选项 □ D. Raw 压缩选项 8. 对于在网络上播放动画来说,最合适的帧频率是: □ A. 每秒24 帧 □ B. 每秒12 帧 □ C. 每秒25 帧 □ D. 每秒16 帧 9. 将舞台上的对象转换为元件的步骤是: □ A. "1.选定舞台上的元素; 2.. 单击Insert> Convert to Symbol,打开Convert to Symbol 对话框 3.填写Convert to Symbol 对话框,并点击确定" □ B. "1.. 单击Insert> Convert to Symbol,打开Convert to Symbol 对话框 2.选定舞台上的元素 3.填写Convert to Symbol 对话框,并点击确定" □ C. "1.选定舞台上的元素,并将选定元素拖到库面板上 2.. 单击Insert> Convert to Symbol,打开Convert to Symbol 对话框 3.填写Convert to Symbol 对话框,并点击确定" □ D. "1.. 单击Insert> Convert to Symbol,打开Convert to Symbol 对话框 2.选定舞台上的元素,并将选定元素拖到库面板上 3.填写Convert to Symbol 对话框,并点击确定" 10. 某电影中,只有一个layer1,其上放置一个有两个元件(test1 和test2)组合成的组合体, 选择这个组合体执行打散Ctrl+B,然后右键单击执行Distribute to layers,那末: □ A. 这个电影中将增加两个新层:layer2 和layer3 □ B. 这个电影中将增加两个新层:test1 和test2,而原有的layer1 将消失 □ C. 这个电影中将增加两个新层:test1 和test2,而原有的图层维持不变 □ D. 这个电影中将增加两个新层:test1 和test2,而原有的layer1 成为空层 11. 全等(===)运算符和相同运算符基本相似,但是它们有一个很重要的区别 □ A. 全等(===)运算符执行数据类型的转换 □ B. 全等(===)运算符不执行数据类型的转换 □ C. 全等(===)运算符永远返回真 □ D. 以上都不对 12. 如果导入的是图像序列中的一个picture001.bmp 文件,并且序列中的其他文件位于相同的 文件夹中,则将被识别为图像序列将是下面哪些: □ A. picture001.bmp □ B. picture002.bmp □ C. picture003.bmp □ D. picture-001.bmp 13. 如果要让Flash 同时对若干个对象产生渐变动画,则必须将这些对象放置在不同的层中。 □ A. 正确 □ B. 错误 14. 矢量图形用来描述图像的是: □ A. 直线 □ B. 曲线 □ C. 色块 □ D. A 和B 都正确
15. 下列那几个属性是 flash mx 不建议使用的属性 □ A. scroll □ B. maxscroll □ C. _droptarget □ D. _highquality 16. 下面的语句说法正确的是: □ A. 目前Flash 最新的创作平台是Flash MX,播放插件是Flash MX Player。 □ B. 目前Flash 最新的创作平台是Flash MX,播放插件是Flash 6.0 Player。 □ C. 目前Flash 最新的创作平台是Flash 6.0,播放插件是Flash MX Player。 □ D. 目前Flash 最新的创作平台是Flash 6.0,播放插件是Flash 6.0 Player。 17. 下面关于FLASH MX 导入Fireworks 的PNG 文件的说法错误的是: □ A. 用户可以选择作为可编辑对象或不可编辑的图像进行导入 □ B. 当作为不可编辑的图像导入时,文件将转换成位图图像对象,但是导入矢量图形除外 □ C. 作为可编辑对象导入,用户可以选择保留位于PNG 文件中的图像、文本和辅助线 □ D. 作为不可编辑的图像导入PNG 文件,则用户可以在Flash MX 中启动Fireworks 编辑该 PNG 图像 18. 下面关于从浏览器打印电影和从Flash 播放器打印电影的说法错误的是: □ A. "从Flash 播放器打印电影,可以指定Flash 电影中的哪些帧可以被打印" □ B. "从Flash 播放器打印电影,可以确定帧的打印区域" □ C. "从Flash 播放器打印电影,可以给电影剪辑中的打印帧附加Print 动作" □ D. 从浏览器打印电影肯定比从Flash 播放器打印电影效果好 19. 下面关于打印Flash 电影说法错误的是: □ A. 打印Flash 矢量图形时,可以在任意尺寸上获得清晰的打印效果 □ B. 打印低分辨率的位图图像时,受到像素的影响 □ C. 不可以从浏览器打印Flsh 电影 □ D. Flash 播放器的打印功能允许用户打印电影中的目录、联票、单篇、收据、发票或其他 文档 20. 下面关于矢量图形和位图图像的说法错误的是: □ A. Flash 允许用户创建并产生动画效果的是矢量图形而位图图像不可以 □ B. 在 Flash 中,用户也可以导入并操纵在其他应用程序中创建的矢量图形和位图图像 □ C. 用FLASH MX 的绘图工具画出来的图形为矢量图形 □ D. 一般来说矢量图形比位图图像文件量大 21. 下面关于通过Flash 播放器的关联菜单打印说法错误的是: □ A. 可打印任意Flash 电影中的帧 □ B. 无法打印透明度 □ C. 可以打印颜色效果 □ D. 无法打印其他电影剪辑中的帧 22. 下面哪个不是FlashMX 中内置的组件? □ A. CheckBox(复选框) □ B. RadioButton(单选钮) □ C. ScrollPane(滚动窗格) □ D. Jump Menu (跳转菜单) 23. 下面哪些操作不可以使电影优化: □ A. 如果电影中的元素有使用一次以上者,则可以考虑将其转换为元件 □ B. 只要有可能,请尽量使用渐变动画 □ C. 限制每个关键帧中发生变化的区域 □ D. 要尽量使用位图图像元素的动画 24. 下面哪些是Flash MX 新增的功能? □ A. 可以导入mp3 格式的声音文件。 □ B. 可以导入视频格式。 □ C. 增加了层文件夹。 □ D. 可以把声音设置成流方式。 25. 下面那个方法不属于 Date(日期)对象 □ A. getDate() □ B. getDay() □ C. getMonth() □ D. getMinute() 26. 要分离位图图像,按以下步骤操作:1、选择当前场景中的位图图像;2、单击 Modify> Trace Bitmap 命令。 □ A. 正确 □ B. 错误 27. 要改变舞台上复选框组件的宽度,可以 □ A. 使用Free Transform(自由变形)工具 □ B. 使用setSize 方法 □ C. 使用AS 中的_width(宽度)属性 □ D. 使用属性面板中的w 属性精确调整 28. 要在组件面板中显示SmartClips 或自定义的组件,应该如何做? □ A. 将包含组件的电影剪辑放在库(Library)中 □ B. 将包含组件电影剪辑的FLA 文件放置在Flash MX 的组件文件夹中 □ C. 将包含组件电影剪辑的FLA 文件放置在Flash6/Configuration/Components 中 □ D. 导入包含组件电影剪辑的SWF 导入 29. 以下各种关于图形元件的叙述,正确的是 □ A. 可用来创建可重复使用的,并依赖于主电影时间轴的动画片段 □ B. 可用来创建可重复使用的,但不依赖于主电影时间轴的动画片段 □ C. 可以在图形元件中使用声音 □ D. 可以在图形元件中使用交互式控件 30. 以下关于使用元件的优点的叙述,正确的是: □ A. 使用元件可以使电影的编辑更加简单化 □ B. 使用元件可以使发布文件的大小显著地缩减 □ C. 使用元件可以使电影的播放速度加快 □ D. 以上均是 31. 以下关于帧标记和批注的说法正确的是: □ A. 帧标记和帧批注的长短都将影响输出电影的大小。 □ B. 帧标记和帧批注的长短都不影响输出电影的大小。 □ C. 帧标记的长短不会影响输出电影的大小,而帧批注的长短对输出电影的大小有影响。 □ D. 帧标记的长短会影响输出电影的大小,而帧批注的长短对输出电影的大小不影响。 32. 以下关于帧并帧动画和渐变动画的说法正确的是: □ A. 两种动画模式FlashMX 都必须记录完整的各帧信息 □ B. 前者必须记录各帧的完整记录,而后者不用 □ C. 前者不必记录各帧的完整记录,而后者必须记录完整的各帧记录 □ D. 以上说法均不对 33. 以下哪些操作可以使Flash 进入直接编辑元件的模式? □ A. ". 双击舞台上的元件实例" □ B. ". 选中舞台上的元件,然后使用鼠标右键单击,从弹出的快捷菜单中选择 Edit in Place" □ C. ". 双击库面板内的元件图标" □ D. 将舞台上的元件拖动到库面板之上 34. 在256 色环境中,可以使用Flash MX 进行创作。 □ A. 正确 □ B. 错误 35. "在Flash MX 中,未定义的toString 是" □ A. """ """ □ B. undefined □ C. NULL □ D. null 36. 在Flash MX 中,要绘制基本的几何形状,可以使用的绘图工具是: □ A. 直线 □ B. 椭圆 □ C. 圆 □ D. 矩形 37. 在Flash MX 中,要绘制精确的直线或曲线路径,可以使用: □ A. Pen Tool(钢笔工具) □ B. Pencil Tool(铅笔工具) □ C. Brush Tool(刷子工具) □ D. A 和B 都正确 38. 在Flash 的测试模式中,下面哪些可以List Objects(列表显示对象)命令来显示: □ A. 帧 □ B. 对象类型(形状、电影剪辑或按钮) □ C. 目标路径 □ D. 电影剪辑的实例名 39. 在Internet Explorer 浏览器中,是通过下列哪种技术来播放Flash 电影(swf 格式的文件)? □ A. DLL □ B. COM □ C. OLE □ D. Active X 40. "在动作列表中,批注以什么颜色来表示" □ A. 绿色 □ B. 紫色 □ C. 蓝色 □ D. 粉红色 41. 在设置电影属性时,设置电影播放的速度为12fps,那么在电影测试时,时间轴上显示的 电影播放速度应该可能是: □ A. 等于12fps □ B. 小于12fps □ C. 大于12fps □ D. 大于、小于12fps 均有可能 42. 在下列哪些操作系统下,可以通过浏览器播放Flash 电影(swf 格式的文件)? □ A. DOS □ B. Windows 95 □ C. Windows 2000 □ D. Redhat Linux 43. 在移动对象时,在按方向键的同时按住 Shift 键可大幅度移动对象,每次移动距离为: □ A. 1 像素 □ B. 4 像素 □ C. 6 像素 □ D. 8 像素 44. 作为发布过程的一部分,Flash 将自动执行某些电影优化操作: □ A. 正确 □ B. 错误
看看你对flash了解多少~~~
答案:
B, C, B, D, A,
A, A, B, A, D,
B, ABCD, A, D, ABD,
B, B, D, C, D,
C, D, D, BC, D,
B, ABD, BC, A,
30D,D, B, AB, A,
35A, ABD, A, ABCD, D,
40 D,AB, BCD, D, A, |
|
在HTML中傳送中文到Flash研究
|
在HTML中傳送中文到Flash研究
在HTML中傳送參數到Flash,常用的方法有兩種:路徑參數(foo.swf?par=123)或FlashVars(<param name="FlashVars" value="par=123" />),參數又可以再分為是否URLEncoded;對於傳送中文,又再分為非Unicode(Big5/GB2312)和Unicode。最後IE和Mozilla處理上又有分別,換句話說,總共有2*2*2*2=16種可能性。
再加上SWF格式為Flash5或以前,Flash是用使用者系統編碼處理中文(非Unicode),Flash6或以後,Flash是用Unicode處理中文。因此,在HTML中傳送中文到Flash,看似很簡單的事,其實包含很多複雜的變化。(16*2=32種可能!!)
在新技術湧現的時代,要將參數傳送到Flash,可以用LoadVars、XML、Flash Remoting和Web Services等,但是在非Browser和連線的環境下,例如嵌入裝置、Flash嵌入其他程式和Server-side的Flash執行環境,仍然需要靠「路徑參數」這方法傳送參數到Flash。
以下講解會以Big5和Unicode為例,比較處理非Unicode和Unicode中文的分別,對於GB2312處理方法,跟Big5相同。第二,例子會用一個中英文混合句子來示範:
可以支援非Unicode的URLEncoded中文了!
Big5 URLEncoded為:
%A5i%A5H%A4%E4%B4%A9%ABDUnicode%AA%BAURLEncoded%A4%A4 %A4%E5%A4F%A1I
UTF-8 URLEncoded為:
%E5%8F%AF%E4%BB%A5%E6%94%AF%E6%8F%B4%E9%9D%9EUnicode %E7%9A%84URLEncoded%E4%B8%AD%E6%96%87%E4%BA%86%EF%BC %81
路徑參數
一個SWF格式為Flash6或以後,以路徑參數傳送中文,有以下結果:
Big5: debugTxt.swf?inTxt=%A5i%A5H...
Big5: debugTxt.swf?inTxt=可以...
UTF-8: debugTxt.swf?inTxt=%E5%8F...
UTF-8: debugTxt.swf?inTxt=可以...
Unicode當然沒有什麼問題,只是Big5 URLEncoded會出現亂碼,在Mozilla情況更壞,無論是否URLEncoded,都是亂碼。
Big5: debugTxt.swf?inTxt=%A5i%A5H...
Big5: debugTxt.swf?inTxt=可以...
第一個本能反應,當然是在Flash裡加上
System.useCodepage = true;
打開swfpath\original\debugTxt.fla看看,其實早已加了,但不起作用。因為所有參數都是在任何ActionScript執行前,已經進入了Flash,所以Flash是用Unicode去解碼這些URLEncoded的Big5,結果發生亂碼。
解決方法,當然是使Flash預設不是Unicode解碼,怎可能?將SWF發佈成Flash5就可以!Flash5的SWF只是一個加載器,主要用作接收參數,然後將真正的Flash加載到_level0,並傳入參數,這樣真正的Flash已經完全取代了Flash5的SWF,只要Flash Player是6/7,仍然可以執行Flash6/7支援的ActionScript。
loadMovieNum("debugTxt2.swf?inTxt="+inTxt, 0);
不過,唯一要留意,由於Flash接收時已經將參數URLDecoded,再傳入真正的Flash時,也是用Unicode去接收/解碼Big5的參數,仍有危機出現亂碼,因此應該將參數兩次URLEncoded,變成普通的英文字元:
loadMovieNum("debugTxt2.swf?inTxt="+escape(escape(inTxt)), 0);
到了真正的Flash時,先解除Flash預設的Unicode解碼,才去URLDecode接收的參數:
System.useCodepage = true; debugtxt.text = unescape(inTxt);
[範例下載]
FlashVars
改用FlashVars傳送參數,無論IE/Mozilla,只有Big5 URLEncoded會出現亂碼,其他Big5 URLDecoded, UTF-8 URLEncoded/URLDecoded都是正常:
Big5: debugTxt.swf?inTxt=%A5i%A5H...
Big5: debugTxt.swf?inTxt=%A5i%A5H...
用剛才方法去解決,結果出現了亂碼:
Big5: debugTxt.swf?inTxt=%A5i%A5H...
Big5: debugTxt.swf?inTxt=%A5i%A5H...
在Flash5的SWF進行URLEncode時字與字之間多了%C2:
%C2%A5i%C2%A5H%C2%A4%E4%B4%A9%C2%ABDUnicode%C2%AA %C2%BAURLEncoded%C2%A4%C2%A4%C2%A4%EF%BF%BD%C2%A1I
因此在真正的Flash,要將%C2弄走才進行URLDecode:
System.useCodepage = true; inTxt = unescape(inTxt.split("%C2").join("")); debugtxt.text = inTxt
遺憾的是,有一些字元,在FlashVars傳到Flash時,已經被破壞了,最後仍然是亂碼,例如「文」字:
Big5: debugTxt.swf?inTxt=%A5i%A5H...
Big5: debugTxt.swf?inTxt=%A5i%A5H...
[範例下載]
URLEncoding其他參考資料
Flash TechNote - URL Encoding: Reading special characters from a text file
本文章由luar發表。 |
|
flash as
|
//mc大小 變代函數 var xscale:Number = 0; var yscale:Number = 0; var scales:Number =100; function MCScale(mc_name:MovieClip, w:Number, h:Number, speed:Number) { mc_name._width += speed*(w-mc_name._width); mc_name._height += speed*(h-mc_name._height); if (mc_name._width>=w && mc_name._height>=h) { delete _root.onEnterFrame; } } //mc大小彈性變代函數 function MCflex(mc_name:MovieClip, r:Number, speed:Number) { xscale = xscale*speed+(scales-mc_name._xscale)*r; yscale = yscale*speed+(scales-mc_name._yscale)*r; mc_name._xscale += xscale; mc_name._yscale += yscale; }
//============================
img_mc.onEnterFrame = function() { this.useHandCursor = false; this.onRollOver = function() { scales = 115; }; this.onRollOut = function() { scales = 100; }; MCflex(this, 0.2, 0.9); };
//==========================
_root.onEnterFrame = function() { MCScale(bg_mc, 770, 300, 0.08); };
<SCRIPT language=JavaScript>
var filename="123.gif";
var uid="123";
document.write("<A href='user_uploadfile.asp?del="+filename+"&userid="+uid+"'>"+filename+"</A><br/>");
//for(i=0;i<10;i++){
//document.write("<A href='user_uploadfile.asp?del="+filename+"&userid="+i+"' id=a"+i+">"+i+"</A><br/>");
//}
//for(j=0;j<10;j++){
//c=eval("a"+j);
//c.click();
//}
</SCRIPT>
|
|
从内存播放Flash
|
前提: 被要求Flash必须加密,不能在硬盘上留下文件。
起点: Flash 播放器的属性Movie接受本地文件名 或者 HTTP URL。
首先当然是在网络上寻找解决方案了。找了半天,发现一个国内的,一个国外的。都在出售。 奇怪的是,他们不约而同的都是用了Delphi。 根据了解的人透露,它是利用了Flash一个未公开的属性MovieData, 该属性文档中没有记录,但是从名称可以看出应该是应该是接受数据片的。
其国内的那一版目前还不支持最新的flash播放器。这让人不能不有点担忧。 因此还是尽量照自己的思路来。
思路: 最开始考虑的就是建一个协议(类似于rtsp的样子)来代替http,并把请求转到本地守护进程。 后来又想到还不如直接建立一个简陋的http服务器,直接使用http url , 这样子肯定是可行的,于是就着手写http服务器了。 写了个简单的测试程序,监听了一些http包,发现即使建立个简陋的http服务器,也需要了解一下rfc2612的,考虑到flash不同版本可能识别的响应及其标签,响应头还是蛮复杂的。 看rfc2612的时候突然想到, 建立http服务器是虚拟一个url;如果能够虚拟一个本地文件名,是不是更简单些呢? 照着这个思路,找了个把小时,当然也走了不少的弯路。最终发现可以用管道来处理。
因为管道客户端也是用CreateFile, ReadFile来处理的, 与普通文件一样。这样子就可以用管道名称来代替文件名来欺骗一下flash乐^_^
被欺骗的Flash读文件的时候:CreateFile, ReadFile实际上是读的是管道,只是他自己不知道而已. 而我们可以向管道写入任何内容,这不就达到目的了么?
写了段代码验证了一下,确实可行。 而且还模拟了网络的流环境(每次读10字节,延迟3ms),发现效果不错,正如预料的一样。
下面贴出来的代码来资源是测试程序,比较零乱。如果你仔细看了上面的内容,并且对于提到的属于没什么不解的话,应该就不用看下面的代码了。 附上来仅仅是为了备忘。
代码是一个console程序, vs2003环境。 假设有个样例Flash为Blue.swf。 设定的管道名称为: \\.\pipe\egbpipe 验证时先运行本程序,并保证blue.swf存在。然后打开flash播放器,用她播放文件"\\.\pipe\egbpipe"。
代码开始: ------------- // PipeService.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h"
#define BUFSIZE 1024 #define PIPE_TIMEOUT 1000
int __main(void); int MyErrExit(char*); int _tmain(int argc, _TCHAR* argv[]) { __main(); return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> VOID InstanceThread(LPVOID); VOID GetAnswerToRequest(LPTSTR, LPTSTR, LPDWORD); VOID GetAnswerToRequest(HANDLE hFile); int xx = 0;
/*
\\.\pipe\egbpipe
*/
int __main(void) { BOOL fConnected; DWORD dwThreadId; HANDLE hPipe, hThread; LPTSTR lpszPipename = "\\\\.\\pipe\\egbpipe"; // The main loop creates an instance of the named pipe and // then waits for a client to connect to it. When the client // connects, a thread is created to handle communications // with that client, and the loop is repeated. for (;;) { hPipe = CreateNamedPipe( lpszPipename, // pipe name PIPE_ACCESS_DUPLEX, // read/write access PIPE_TYPE_MESSAGE | // message type pipe PIPE_READMODE_MESSAGE | // message-read mode PIPE_WAIT, // blocking mode PIPE_UNLIMITED_INSTANCES, // max. instances BUFSIZE, // output buffer size BUFSIZE, // input buffer size PIPE_TIMEOUT, // client time-out NULL); // no security attribute
if (hPipe == INVALID_HANDLE_VALUE) MyErrExit("CreatePipe"); // Wait for the client to connect; if it succeeds, // the function returns a nonzero value. If the function returns // zero, GetLastError returns ERROR_PIPE_CONNECTED. fConnected = ConnectNamedPipe(hPipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); if (fConnected) { // Create a thread for this client. hThread = CreateThread( NULL, // no security attribute 0, // default stack size (LPTHREAD_START_ROUTINE) InstanceThread, (LPVOID) hPipe, // thread parameter 0, // not suspended &dwThreadId); // returns thread ID
if (hThread == NULL) MyErrExit("CreateThread"); else CloseHandle(hThread); } else // The client could not connect, so close the pipe. CloseHandle(hPipe); } return 1; } VOID InstanceThread(LPVOID lpvParam) { CHAR chRequest[BUFSIZE]; CHAR chReply[BUFSIZE]; DWORD cbBytesRead, cbReplyBytes, cbWritten; BOOL fSuccess; HANDLE hPipe; // The thread's parameter is a handle to a pipe instance. hPipe = (HANDLE) lpvParam; // while (1) { // Read client requests from the pipe. /* fSuccess = ReadFile( hPipe, // handle to pipe chRequest, // buffer to receive data BUFSIZE, // size of buffer &cbBytesRead, // number of bytes read NULL); // not overlapped I/O
if (! fSuccess || cbBytesRead == 0) break; */ //GetAnswerToRequest(chRequest, chReply, &cbReplyBytes); GetAnswerToRequest(hPipe); /* // Write the reply to the pipe. fSuccess = WriteFile( hPipe, // handle to pipe chReply, // buffer to write from cbReplyBytes, // number of bytes to write &cbWritten, // number of bytes written NULL); // not overlapped I/O
// if (! fSuccess || cbReplyBytes != cbWritten) break; */ } // Flush the pipe to allow the client to read the pipe's contents // before disconnecting. Then disconnect the pipe, and close the // handle to this pipe instance. FlushFileBuffers(hPipe); DisconnectNamedPipe(hPipe); CloseHandle(hPipe); }
int MyErrExit(char* szInfo) { return MessageBox(0, szInfo, "Whoo", MB_OK); }
VOID GetAnswerToRequest(HANDLE hFile) { const int BuffLen = 10; byte buff[BuffLen] = {0};
FILE* f = fopen("blue.swf", "rb");
int iLen = BuffLen; while(iLen == BuffLen) { iLen = fread(buff, sizeof(byte), BuffLen, f);
Sleep(3); DWORD uLen = 0; WriteFile(hFile, buff, iLen, &uLen, NULL); } _fcloseall( ); }
|
|
提高flash程序效率得方法
|
随着Flash的ActionScript功能的不断强大,使用Flash制作应用程序也越来越多了,但让众多AS程序员最头疼的就是Flash的程序处理效率太低,就算现在flashplayer7虽然效率比flashplayer6提高了2~8倍,但还是低的要命,尤其是在手持设备中就更加严重了(在PPC上现在Flash2004的所有组件都没法使用,需要自行开发),这样就让很多as程序员不断的研究比较action中哪个方法效率更高,哪条指令更快.甚至有些人只用while循环而不用for循环(因为很多测试表明while循环比for循环要快一点),但这种做法实际上没快多少确让程序读/写起来都要麻烦许多,其实真正提高程序的效率,不是比较类似while for循环哪个更快,而是要找到程序效率低的瓶颈
一段程序的效率,最关键的看算法,就算用最快的计算机语言(比如用c),如果算法不好,大部分执行时间都是被浪费掉了,而不是充分利用起来,那程序一样会很慢,而如果算法得当,可能解决问题根本就不用很大量的计算,因此即使使用效率很低的action一样能很快的解决(虽然action很慢,但每秒一样能循环循环几十万次,同样能在很短的时间内完成很多事情,所谓慢是比较更快的程序语言来说的)
在这里咱们不谈算法,单独从FlashPlayer上说,怎么才能提高action的效率呢?要提高效率就要抓住根本,抓住Flash为什么运行的慢,action执行效率低,最根本的原因是action是解释性语言,每句代码都需要flashplayer去解释执行,这就是action执行效率低的根本原因,那如果去提高action的效率呢?去比较哪句action的效率更高吗,所有的action都是player去解析的,肯定相差不大,那怎么办呢?当然就是尽量少使用action进行处理
大家都知道FlashPlayer是用c语言来写的,那flash里面的所有内置函数肯定都是使用c语言实现的(虽然flash执行action的速度比较慢,但flash的内置函数确实非常快的,比如flash下Math下面的方法都是效率很高的),那我们如果能把我们原来用action来处理的方法改用flash内部方法来处理就肯定要快多了
那怎么才能使用内置方法代替action呢,这个要看个人水平跟对Action的熟悉程度了,下面介绍一个例子,来解释一下:
action程序员都知道action处理String的效率是非常低的,可是说低的可以,下面代码可以说明:
var str = "abcde"; var tmp = ""; var time1 = getTimer(); for(var i=0;i < 10000;i++){ tmp += str; } trace(getTimer() - time1);//1665
将10000个5个字母的字符串连接起来竟然需要1.5s以上的时间(cpu: pm1.4) 而改成10个字母就需要使用4s左右的时间,15个字母就需要5.5s左右的时间 随着字符串的变长,字符串处理的速度越来越低
那怎么能让字符串连接的更快呢?看一看下面这段代码:
time1 = getTimer(); var tmpA = new Array(); for(var i=0;i < 10000;i++){ tmpA[i] = str; } var tmp1 = tmpA.join(""); trace(getTimer() - time1); trace(tmp1 == tmp);
这段代码是接在上面的代码后面的,这里思路有所不同的是,在这里先把字符串一个一个的付给数组,然后利用数组的join方面一下子将整个数组转换为字符串,你也许会想,先付给数组,然后再有数组转换,肯定会更慢.但实际上不是这样的,因为赋值语句在as里面是很快的,所以将10000个字符串付给数组花不了多长时间,而最后调用的数组的方法是as内部函数,完全有c实现的,因此肯定要比as实现快很多倍,因此整体速度跟上面的代码就相差很多了,而且随字符串增长,效率也不会明显降低,下面是执行结果:
同样为10000个字符串连接,5个字符第二种方法只需要140ms,比直接连接字符串快10倍左右,而后面的比较输出true说明两个字符串是一样的 而且当字符串加置10个,15个甚至更多的时候,效率并没有降低,而仍然用时140ms左右,而当字符串长度达到40的时候,用时才超过了200ms
|
|
Flash 组件应用与开发2
|
Flash 组件应用与开发(下)
Flash V2组件开发
在Flash MX Professional 2004中,开发人员开可以在项目中自己创建新的V2组件。在开始开发V2组件之前,首先要了解MovieClip类、UIObject类和UIComponent类,因为它们是Flash V2组件的基类,所有Flash自带的组件都是它们的直接或间接子类。开发一个组件可以从原先的父类继承,扩展现有的组件类,使被创建的组件在父类的基础上进一步扩展。另外,也可以创建一个不带父类的组件,以实现一些其它的功能。在这里将重点讨论如何扩展现有的组件类。扩展一个现有组件类,通常包括以下几个步骤:
1、组件首先作为一个电影剪辑(MovieClip)被创建,在该电影剪辑中创建两个图层,分别用于组件界面元素和脚本。然后在库的下拉菜单中选择Component Defination,在该对话框中的AS2.0 Class中输入该组件所要关联的类的完全限定名。当界面元素定义完成以后,就可以在外部文件中创建组件的属性、事件和方法,当然,组件的界面元素也可以在类中使用代码动态创建。
2、在定义组件类文件时,首先必须导入所需要的类,前面已经说过,MovieClip类、UIObject类和UIComponent类是V2组件的基类,所以如果当前创建的组件是从V2组件的任意组件扩展,那么就必须了解这三个基类,和其下的相关组件类。关于组件的特性可以查看Macromedia公司发布的组件字典,也可以直接在FlashInstalDir\en\First Run\Classes目录查看类文件代码。
3、确定组件所要扩展的类以后,就要为组件类编写构造函数(Constructor)。一般情况下,构造函数建议为空,这样才能用对象的属性接口来定义对象属性。此外,根据初始化调用顺序的不同,有时在构造函数中设置属性会导致覆盖默认值。
4、接下来要做的是添加组件的版本信息,如果当前开发的组件是作为组件包的一部分,那么可以把版本信息放到另外一个外部文件中。在定义版本信息时,可以继承UIObject类的静态字符串属性version。另外还需要定义三个比较重要的属性:symbolName,symbolOwner和className;他们都是从组件基类继承的。symbolName定义为静态的字符串变量,用于指定组件符号的名称;symbolOwner定义为静态的Object类型,是该类的一个完全限定名,它将在createClassObject() 方法的内部调用中被使用;className定义了组件类名称。
5、当这些都完成以后,就要开始定义组件功能相关的属性和方法。在属性和方法定义时,比较好的做法是确定每一个属性和方法的访问特性,使组件为用户提供一个良好的应用程序接口(API)。所以在定义属性和方法时要使用private和public来声明属性的可访问性,并使用setter和getter函数来设置和获取属性的值。这样就更好的地实现了组件的封装,使用户无须了解组件的内部细节。
所有组件必须实现两个核心方法:始化方法和大小调整。如果不在自定义组件的类文件中覆盖两个方法,Flash Player 可能会产生错误。Flash 在创建类时调用初始化方法。初始化方法应该调用父类的初始化方法,因为只有在调用此方法之后,才能正确设置width、height 和和其它的影片剪辑参数。
function init(Void):Void
{
// 调用父类的初始化方法
super.init();
//在这里添加与本组件相关的初始化代码
}
大小调整的方法也与初始化方法类似:
function size(Void):Void
{
super.size();
//在这里添加与本组件相关的大小调整代码
}
6、为了让属性在开发面板中可见,还必须为属性声明相关的元数据(Metadata)。元数据标记可以定义组件属性、数据绑定属性和事件。Flash 可以解释这些语句并相应地更新开发环境。元数据与类声明或单个的数据字段相关。元数据语句绑定到脚本的下一行。例如,在定义组件属性时,在属性声明的前一行添加元数据标记。在定义组件事件时,在类定义之外添加元数据标记,以便将事件绑定到整个类。对属性而言,有两个比较重要的元数据:Inspectable和InspectableList。
Inspectable元数据定义了在“组件检查器(Component Inspector)”面板中向用户显示的组件的属性。语法如下:
[Inspectable( value_type=value [,attribute=value,...] ) ]
property_declaration name:type;
Inspectable元数据还包括若干元数据标记:
·name:类型为String(可选),属性在开发面板中的显示名称。
·type:类型为String(可选)指定属性的类型。如果省略,则使用属性的类型。以下下是可接受的值: Array、 Object、List、String、Number、Boolean、Font Name、Color。
·defaultValue:类型可以是String或Number(必需)。指定属性的默认值。
·enumeration:类型为String(可选)。指定以逗号分隔的属性合法值列表。
·category:类型为String(可选)。将属性划分到属性检查器中的某个特定子类别中。
InspectableList 元数据关键字用于确切地指定属性检查器中应显示可检查参数的哪个子集。可以将 InspectableList 与 Inspectable 组合使用,这样即可隐藏子类组件的继承属性。如果不给组件的类添加 InspectableList 元数据关键字,所有可检查的参数(包括组件父类的可检查参数)都会显示在属性检查器中。其的语法如下:
[InspectableList("attribute1"[,...])]
// class definition
InspectableList 关键字必须紧挨着类定义且在它之前,因为它应用于整个类。
7、定义组件的事件,首先要使用Event元数据关键字声明事件。Event 元数据关键字用于定义组件事件。其语法如下:
[Event("event_name")]
在类文件中必须把 Event 语句添加到类定义之外,以便将它们绑定到类,而不绑定到类的特定成员。首先组件类会继承基类事件。如果当前定义组件的基类是UIComponent,那么该组件中已经包括了MovieClip类、UIObject类和UIComponent类的28个事件。但事实上,这28个事件并不是都可以用的。其原因很简单,因为组件可以有它的组成结构,组件内部可能还有组件或是其它的元件实例。组件要为用户提供一个统一的接口,就必须抽取其内部结构的某些事件并把它们定义为组件的事件,这是一种基于组件内部组成结构的事件。比如说组件包括两个文本框T1和T2,这时可以根据组件的功能要求把T1的change事件发布为组件的PP事件,而把T2的change事件发布为组件的UU事件,当然关于组件事件的名称可以由组件开发人员自己定义。
那么究竟如何为组件定义一个新的事件呢?对于上面的那个例子,可以做如下定义:
//导入类
import mx.core.UIComponent;
//用元数据声明组件事件
[Event("PP")]
[Event("UU")]
//指明该类从UIComponent继承
class T_T extends UIComponent
{
//在编辑环境中已经创建两个输入文本(Input Text),并在类中声名其引用。
var T1:TextField;
var T2:TextField;
//定义构造函数
function T_T()
{
//在构造函数中发布T1的change事件
T1.onChanged=function()
{ //创建一个事件对象,存放与事件相关的信息
var eventObj = new Object();
//定义事件类型的名称
eventObj.type = "PP";
//指明事件广播(发生)的对象
eventObj.target = _parent;
//把事件作为组件的事件发布
_parent.dispatchEvent(eventObj);
}
//在构造函数中发布T2的change事件
T2.onChanged=function()
{
var eventObj = new Object();
eventObj.type = "UU";
eventObj.target =_parent;
_parent.dispatchEvent(eventObj);
}
}
}
在以上代码中,先用元数据声明了组件的两个事件UU和PP,然后又在组件类的构造函数中定义T1和T2的change事件,并在它们的change事件中用_parent.dispatchEvent(eventObj);语句把chang事件发布为组件事件。dispatchEvent()方法需要一个Object类型的事件对象作为参数,该对象中保存了与事件相关的信息:target指明事件广播(发生)的对象;type定义了事件类型的名称——也可以认为是事件名称。在事件脚本中使用如下代码就可以对事件做出响应,其使用方法与一般的事件处理方法一致:
//对组件的PP事件做出响应
on(PP)
{ trace("PP"); }
//对组件的UU事件做出响应
on(UU)
{ trace("UU"); }
组件的属性的改变也可以作为事件发布,例如:
private var Tm:String;
//在setter中发布组件的事件
public function set TTm(val:String)
{
Tm=val;
var eventObj = new Object();
eventObj.type = "KK";
eventObj.target =this;
this.dispatchEvent(eventObj);
}
当然,还要用Event元数据为组件声明事件。但事实上,没有Event元数据声明的事件组件同样可做出响应。Event元数据声明似乎仅仅是多了一个代码提示而已。所以元数据只是为组件提供了一个更加友好的用户接口,使开发人员更加容易得使用组件。
在发布组件之前,还可以为组定制一个图标。图标大小要求为 18 x 18 像素,并保存为 PNG 格式。它的 Alpha 透明度必须是8位,左上角的像素要求是透明的,以支持遮罩。另外还需要在组件类文件中定义添加元数据声明:
[IconFile("component_name.png")]
该声明和事件声明一样,必须放在类定义之前,使该声明作用到组件类。最后将该图像保存到到FLA文件所在的同一目录中。在导出 SWC 文件时,Flash将在自动包含该图像。
当组件定义完整,测试通过后,就可以发布组件供其他开发人员使用。Flash MX 2004 将组件导出为组件包(SWC 文件)。在发布组件时,只需向其他开发者提供 SWC文件就可以了。此文件包含与组件相关的所有代码、SWF 文件、图像和元数据,因此其他开发者可以方便地将它放到自己的 Flash开发环境中。
这里对Flash V2组件开发做了初步的讨论。在具体的开发时,应根据组件的功能特性非常细致地刻画组件的属性、事件和方法,声明元数据定义良好的用户接口。如果该组件是一个可视的组件还需要为组件制作组件界面的图形元素。 |
|
Flash 组件应用与开发1
|
Flash 组件应用与开发
一、Flash 组件概述
组件是带有参数的电影剪辑,这些参数可以用来修改组件的外观和行为。每个组件都有预定义的参数,并且它们可以被设置。每个组件还有一组属于自己的方法、属性和事件,它们被称为应用程序程接口(Application Programming Interface,API)。使用组件,可以使程序设计与软件界面设计分离,提高代码的可复用性。Flash MX 2004 或 Flash MX Professional 2004 中包含的组件不是 FLA 文件,而是 SWC 文件。SWC 是用于组件的 Macromedia 文件格式。库项目中的电影剪辑可以被预编译成swf文件。这样可以缩短影片测试和发布的执行时间。将 SWC 文件拷贝到 First Run\Components目录后,该组件便会出现在“组件”面板中。
二、组件基类
Flash 自带的组件都位于mx.controls包中。组件直接或间接继承于UIComponent类,UIComponent类对UIObject类做了扩展,而UIObject类又是MovieClip类的子类。MovieClip类不属于任何包,定义文件位于FlashInstalDir\en\First Run\Classes目录。UIComponent类和UIObject类都位于mx.core包中,定义文件位于FlashInstalDir\en\First Run\Classes\mx\core目录。
UIObject类对MovieClip类进行封装,所有Flash V2组件都可以共享它的方法、属性和事件。UIObject类使组件在样式、事件和缩放比例调整上得到了实现。它提供了动态创建删除组件的方法:
·createObject方法:直接调用attachMovie函数,返回一个MovieClip类型的引用。
·createClassObject方法:调用createObject方法,创建一个指定类的组件实例,并返回所创建的组件的引用。
·createEmptyObject方法:创建一个空的UIObject实例。
·destroyObject方法:使用delete语句删除已经创建的组件实例。
UIObject还封装了其它的一些方法,包括:
·redraw方法:在当前帧重新绘制组件。
·invalidate方法:标记组件,使之在下一个帧间隔重新绘制。
·move方法:把组件移动到指定位置。
·setSize方法:设置组件大小。
·setSkin方法:设置组件皮肤。
·getStyle方法:获取样式信息。
UIObject类的属性除了scaleX和scaleY外,其它都是只读属性,使用时需要注意。所以如果要在运行时调整组件外观,就必须使用UIObject类的方法。对于只读属性的赋值是无效的,即使是对非只读属性的赋值,有时也会造成组件在外观显示上的差错。UIObject类还定义了一系列的事件,包括加载事件(load)、卸载事件(unload)、移动事件(move)、重绘事件(draw)和大小调整事件(resize)。
利用UIObject类的组件创建方法,可以在运行时创建组件实例。
UIComponent类从UIObject类继承,它并不是一个可视的组件。和UIObject类一样,所有Flash V2组件都可以共享它的方法和属性。它实现了组件的焦点获取、键盘输入,组件的禁用和启用以及组件的按布局调整自动大小。
UIComponent类的主要方法有:
·getFocus方法:利用焦点管理器(Selection)返回一个当前获取焦点的对象的引用。
·setFocus方法:使组件获取焦点。
UIComponent类的enabled属性指定组件实例是否可用;tabIndex属性指定组件的焦点获取顺序。UIComponent类还定义一系列焦点和键盘事件:焦点获取事件(focusIn),焦点转移事件(focusOut)、键盘按下事件(keyDown)和键盘释放事件(keyUp)。
三、Flash V2 组件的基本使用方法
在Flash MX 2004和 Flash MX Professional 2004自带了一套组件称为Flash V2组件,它是从Flash MX的V1组件升级而来的,V1组件和V2组件尽量不要一起使用以免发生一些错误。V2组件支持实时预览,使开发者在编辑状态下就能看到组件的外观效果。开发者可以自行设置是否需要实时预览和实时预览的模式,以节省计算机资源。在ControlàEnable Live Preview菜单设置是否使用实时预览,在ViewàPriview Mode菜单选择预览模式。组件实质上是一些被编译好的电影剪辑,其格式为SWC。SWC文件类似与Zip文件,可以使用一般的解压缩程序进行解压查看其内容。电影剪辑可以在编辑环境中直接发布为组件,也可以直接编译存储为swc格式的组件文件,便于其他开发者使用。同样,开发者也可以从外部导入组件。
使用组件,必须把组件面板中所需要的组件拖到舞台(Stage),使组件出现在库面板。这样组件就可以象普通的库项目一样被使用。使用脚本可以动态的创建组件实例,运行时创建组件可以有三个方法:createObject()、creatClassObject()和attachMovie()。attachMovie()是MovieClip类的方法,createObject()和creatClassObject()是UIObject类方法,但事实上它们都是对attachMovie()的直接或间接调用。
组件被添加后可以在属性或参数面板中直接设置组件的参数。另外还要为组件定义事件,最简单的方法是使用on(eventName)进行定义。另外还可以使用侦听器和事件处理函数等定义组件事件的处理方法。组件的事件定义比较灵活,使用何种方式定义取决与个人的习惯与偏好。当事件发生时,组件会广播一个Object类型的事件参数,该参数中包括了事件发生对象和事件类型的信息。另外,使用深度管理器(DepthManager)可以对组件进行深度管理。
Flash组件最大的特点是开发者可以自定义组件,尤其是界面元素的自定义,使其更具有吸引力。V2组件有它自己的一套默认界面方案,称为主题(Theme)。主题包括两个方面:样式(Style)和外观(Skin)。UIObject类的setStyle()和getStyle()方法可以获取和设置组件的样式。样式的设置比较简单,主要有以下三种方式:
·直接设置属性:
T.color=0xff5567;
·使用简单的setStyle()名值对方法自定义样式:
instanceName.setStyle("property", value);
·把样式对象与setStyle()方法结合使用来自定义样式:
//创建一个样式对象
var styleObj = new mx.styles.CSSStyleDeclaration;
//刻画样式细节
//……
styleObj.fontSize = 18;
//把样式应用到组件实例
b.setStyle("styleName", styleObj);
样式的级别包括4个层次:全局样式,应用于所有组件;组件类单独的默认样式,应用于某一类的组件;自定义样式;直接设置组件实例的属性。对于不同级别的样式Flash按照一定的顺序分别把这些样式应用到组件。
首先,Flash 查找组件实例上的样式属性,如果实例上没有直接设置样式,Flash 将查看实例的styleName 属性,确定是否向它分配了样式声明。如果 styleName 属性没有被分配样式声明,Flash 将查找默认类样式声明上的属性。如果没有类样式声明,并且属性没有继承它的值,则将检查 _global 样式声明。如果属性未在 _global 样式声明中定义,则该属性为 undefined。
另外,如果没有类样式声明,但属性确实继承了它的值,Flash 将查找该实例父级上的属性。如果属性未在父实例上定义,Flash 将检查父实例的 styleName 属性;如果未定义该属性,Flash 将继续查看父实例,直到 _global 级别。如果属性未在 _global 样式声明中定义,则该属性为undefined。
另一方面,为了更好的使用组件,还需要修改或重新定义组件外观。Flash V2的外观定义文件位于FlashInstralDir\en\First Run\ComponentFLA文件夹下。在修改外观时,需要把原始的外观定义文件作为外部库导入(FileàOpen External Library),并把外部库中的外观定义库项目拖到当前文档的库中,外观库项目通常都是电影剪辑(MovieClip)。每一个组件外观定义库项目文件夹中都包含一个States文件夹,其中定义了组件在不同状态下的外观,每一个状态都指定了一个链接名(linkageName)作为脚本引用,如果修改了这个名称,则会使组件在该状态下的外观加载发生错误。在组件的类文件中,每一个状态都使用一个字符串属性指定其外观库项目的链接名,如果要重新定义组件某一状态下的外观,只要在脚本中修改这个字符串属性的值就可以了,当然首先必须存在可链的新的外观库项目。
了解了这样一个组件外观机制以后,组件外观的修改就变的非常简单。其关键就是修改或重新定义一组新的外观库项目并指定其链接名,然后修改组件类文件中指定组件外观的属性。开发者可以在组件实例的初始化事件(initialize)中修改组件实例的外观。修组件所有实例外观的方法比较多,例如_root的第一帧使用ClassName. prototype.stateName=value语句,该语句也可以直接在#initclip和#endinitclip代码块中使用;另外还可以使用类继承的方式,在组件初始化时就为组件外观链接属性指定新的值,这里也需要用到#initclip、#endinitclip代码块。#initclip和#endinitclip是Flash的编译器命令,作为初始化代码块的开始标记和结束标记。只要符号(symbol)被定义,那么初始化代码就被先于第一帧执行,而且紧执行一次。所以在这个代码块中,可以为整个组件类指定不同状态下的外观 |
|
« 1 ›
|