Monthly Archives: August 2008

Firefox下Flash层叠显示的怪异现象

在Firefox下看上面两个层叠的Flash的显示,效果会很怪异,两个Flash在显示时,层次混乱。下面是相应的代码:
<div style=”z-index:30;”>
<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=”550″ height=”400″>
<param name=”movie” value=”test0.swf” />
<param name=”quality” value=”high” />
<embed src=”test0.swf”
quality=”high” pluginspage=”http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash”
type=”application/x-shockwave-flash” width=”550″ height=”400″>
</embed>
</object>
</div>
<div style=”z-index:100; margin-top:-300px;”>
<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=”550″ height=”400″>
<param name=”movie” value=”test1.swf” />
<param name=”quality” value=”high” />
<embed src=”test1.swf” quality=”high” pluginspage=”http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash” type=”application/x-shockwave-flash” width=”550″ height=”400″></embed>
</object>
</div>
在IE下显示没有这个问题。不知道是Firefox的问题,还是Firefox下的Flashplayer的问题。我想了一个解决这个问题的办法,就是将其中的一个或者两个都分别放到另外的页面里,然后通过iframe来加载,而不是直接使用object标签。
下面将主页面index.html的body里面的代码改成下面这样:
<div>
<iframe src=”frame.html” width=”550″ height=”400″ frameborder=”0″></iframe>
</div>
<div style=”margin-top:-300px”>
<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=”550″ height=”400″>
<param name=”movie” value=”test1.swf” />
<param name=”quality” value=”high” />
<embed src=”test1.swf” quality=”high” pluginspage=”http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash” type=”application/x-shockwave-flash” width=”550″ height=”400″></embed>
</object>
</div>
页面frame.html的body里面的代码如下:
<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=”550″ height=”400″>
<param name=”movie” value=”test0.swf” />
<param name=”quality” value=”high” />
<embed src=”test0.swf” quality=”high” pluginspage=”http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash” type=”application/x-shockwave-flash” width=”550″ height=”400″></embed>
</object>
显示效果如下:
试了一下这样,在Firefox2和Firefox3(包括Mac下的)都能正常,不过,Windows下的Safari还是不能正常,庆幸的是Mac上的Safari是正常的,毕竟没人会在Windows下用Safari看网页吧。
Windows Firefox 3.6中已经不存在这样的问题。

Firefox下IFrame显示的BUG

发现了一些FlashPlayer 9 与FlashPlayer 10之间的不一样之处,很是怪异。 处理XML: 在Flash 10中将播放器设为Player 9后下面代码执行结果为
[xml]

world


[/xml]
而设为Player 10后执行结果为
[xml]

world

[/xml]
//以下为代码
[as3]
var xml:XML = ;
xml = xml.site[0].appendChild(“

world

“);
trace(xml);
[/as3]
而下面这个代码的执行结果确又是一样的 //代码
[as3]
var xml:XML = ;
xml = xml.site[0].appendChild(

world

);
trace(xml);
[/as3]
结果都是

world

有点晕,不知道是何原因。所以为了防止播放器的不一致,遇到这种appendChild()里面放置字符串的情况还是改用类似下面的写法,算Flash狠了。
[as3]
var xml:XML = ;
xml = xml.site[0].appendChild(new XML(“

world

“));
trace(xml);
[/as3]
这样,两个播放器也就一致了。 代码的执行顺序: 这个很有问题,如果两个代码执行顺序不一致,那可能运行的效果就完全不一致。不过两个版本确实在这方面存在差异。 如果我们只是简单地新建一个Flash文件,在里面新建一个MovieClip并且在其第一帧上增加下面的代码:
[as3]
trace(“onframe1 before call gotoandplay 10”);
gotoAndStop(10);
trace(“on frame 1 after call gotoandplay 10”);
[/as3]
在其第10帧处插入下面的代码:
[as3]
trace(“now on frame 10”);
[/as3]
把文件的设置中的播放器设成 Flash Player 9 或者 Flash Player 10 其执行结果是一致的,都是: onframe1 before call gotoandplay 10 on frame 1 after call gotoandplay 10 now on frame 10 也就是说是执行完第一帧上的所有代码后再执行第十帧上的代码,这一点应该是跟我们想像的一致的,也没什么异议。 但是我们改一种写法,删除刚才这个文件中的这个MovieClip中的第一帧的代码,将这个MoiveClip的Class设置成TestMC,并且新建一个TestMC.as的文件,内部代码为:
[as3]
package
{
import flash.display.MovieClip;

public class TestMC extends MovieClip
{
public function TestMC()
{
stop();
trace(‘[use class]before gotoAndStop 10’);
gotoAndStop(10);
trace(“[use class]after gotoAndStop 10”);
}
}
}
[/as3]
这样一来,在播放器设成 Flash Player 9时执行的结果是: [use class]before gotoAndStop 10 [use class]after gotoAndStop 10 now on frame 10 跟刚才的上面的顺序也是一致的,不过在将播放器设成 Flash Player 10时,执行结果却是: [use class]before gotoAndStop 10 now on frame 10 [use class]after gotoAndStop 10 也就是说这样一来,先执行被调用的帧上的代码,然后再继续现有的代码,等于是把“gotoAndStop”到的相应帧上的代码插入到现有的代码中执行,这个顺序跟之前的是完全不一样的。到底是哪一种执行的顺序是更合理的?不是很好说,不过作为一个专业级的程序员,一个好的习惯是尽量少在帧上写代码。 点击此处下载与此相关的测试文件。

Flash中显示HTML页面

  每次遇到要在Flash中显示HTML内容,都是噩梦,Flash里的TextField是可以显示HTML内容的,但是,功能确实很差劲,尤其是再遇上对排版要求比较高的时候,TextField是根本做不了的了。有一个开源项目htmlwrapper倒是可以利用一下,htmlwrapper可以让当前的HTML的页面以Flash的形式显示。http://motionandcolor.com/wrapper/这个是它的一个示例,它将一个WordPress的页面用Flash的方式显示出来,你要是查看它的源代码就会发现,所有的内容其实都是写在页面里,而不是Flash里的。但是,我个人觉得把一个本来在浏览器里正常显示的HTML页面放到Flash里显示没什么好处。
  不过嘛,如果用这个项目来把我们要显示的某个HTML加载到我们的Flash里,倒是也不错。只是CSS样式只有部分支持,而且这个项目还有不少的Bug。但是在没有其他解决方法的情况下也只能用这个,总比使用TextField强。

北大爆强失恋诗 [转][经典]

何故

昨日暮

偶遇见她

把纤纤玉手

交那衰人牵住

盈盈笑语左右顾

神采飞扬凌波微步

美眸中一片深情倾注

似前年与我同在湖畔路

也这般附耳交顾低语倾诉

如今见我头也不点形同陌路

我发现自己旧情难忘六神无主

两眼痴呆双脚生根心内如被汤煮

像我这么优秀的男子她总嫌我老土

那土鳖相貌恶心行止猥琐她爱他粗鲁

女孩子搞不清她想什么我越琢磨越胡涂

明知道她与自己不合适想忘记她另起灶炉

到头来都只能是剪不断理还乱最终于事无补

兄弟我长这么大从来没怕过谁却栽给了这个主

看来是上辈子欠她很多钱早知如此就不该和她堵

碰上她算我倒霉下次说什么也得找个温柔姑娘相处

总算明白这世上漂亮不能当饭吃往往还让你难堪重负

从现在起踏踏实实勤勤恳恳谦虚谨慎待人有礼爱护公物

切记过马路左右看要走人行斑马线要想富少生孩子多种树

化悲痛为力量一边努力学习一边时刻准备着开发祖国大西部

大丈夫何患无妻没有了你虽然孤独但也使我从此不再一叶障目

这也使我好好反思为什么会失败总结经验教训继续探索革命道路

我会遇上好姑娘没命地追她想她爱她决不放过她不管她属虎还属兔

回贴

这个有志青年是个好同志失恋了不失魂落魄自暴自弃颇有男儿气度

他虽然遭遇了现代女陈世美被无情抛弃但没有怪命也不埋怨愤怒

反而擦亮眼睛激发斗志将其丑恶行径卑鄙嘴脸进行了深刻揭露

再次论证了阶级斗争将会在一定范围内长期存在的精辟论述

展望了初级阶段革命尚未成功同志仍需努力这条基本道路

尤其难能可贵的是该同志认真反省自己并触动灵魂深处

认识到过去在湖畔漫步是小资产阶级情调的严重错误

险些为漂亮的外表所迷惑中了糖衣炮弹的惯用招数

理论联系实际痛定思痛如梦方醒才知道差点迷途

漂亮不能当饭吃漂亮不是本质不是革命的全部

语言虽然通俗但体现了有志青年的朴实感悟

批评与自我批评言辞感人真可谓发自肺腑

并萌发修身齐家治国平天下的远大抱负

体现了由此及彼由表及里的思想反复

像他这么优秀的青年怎么能说他土

自然是徒具外表的女人有眼无珠

天涯何处无芳草佳丽不问出处

好马不吃回头草旧情勿枉顾

兔子不吃窝边草以为三窟

百步之内必有芳草无数

也许有天她变成弃妇

才会想起你的好处

再回来找你倾诉

一切已经太晚

你也有今天

一屑不顾

不理她

扮帅

Flash远程调试

  Flash里调试工具是可以实现远程调试的,这个有时也很有用,比如在某些时候,在Flash调用了外部的文件(XML等等),当你在本地DEBUG时,可能就会出现安全沙箱冲突的问题,这个时候,远程调试就派上用场了。
要使用远程调试,首先就是要下一个Debug版的Flash浏览器插件。具体下载网址是:http://www.adobe.com/support/flashplayer/downloads.html
。下载安装好后,下面就是要把你的要调试的Flash发一个Debug版本(SHIFT+CTRL+ENTER),接着使得Flash能够通过http://localhost/XX/XX.swf这样的路径访问,也就是配IIS或者Apache了,然后点击Flash编辑器里的调试->开始远程调试会话->ActionScript 3,最后通过在浏览器里输入http://localhost/XX/XX.swf这样的网址访问你的SWF,这时你发现Flash编辑器里的调试工具就会有响应了。

实现AS3(Flash9)与AS2(Flash8)的相互通信

  AS3与AS2使用了不同的ActionScript 虚拟机(ActionScript Virtual Machine (AVM)),两者相互通信还是比较困难的,要是你在一个现有的Flash 9版本的一个SWF里加载一个Flash 8版本的SWF是可以的,但是,你直接调用里面的方法是不被允许的,要是你trace一下加载进来的内容,你会发现它的类型是AVM1Movie,这个类型的文档里有详细解释:

  AVM1Movie 是表示使用 ActionScript 1.0 或 2.0 的 AVM1 影片剪辑的简单类。 (AVM1 是用于运行 ActionScript 1.0 和 2.0 的 ActionScript 虚拟机。AVM2 是用于运行 ActionScript 3.0 的 ActionScript 虚拟机。) 当 Loader 对象加载 Flash Player 8 或更低版本的 SWF 文件时,会创建 AVM1Movie 对象。 AVM1Movie 对象可以使用继承自 DisplayObject 类的方法和属性(如 xywidth 等)。 但是,不允许 AVM1Movie 对象和 AVM2 对象之间进行互操作(如调用方法或使用参数)。

  AVM2 SWF 文件加载 AVM1 SWF 文件具有几个限制:

  • 加载的 AVM1Movie 对象将作为 AVM1 SWF 文件和它加载的所有 AVM1 SWF 文件的 psuedo-root 对象操作(如同将 ActionScript 1.0 lockroot 属性设置为 true)。 AVM1 影片始终位于任何子级中任何 ActionScript 1.0 或 2.0 代码执行的顶部。 除非在加载的 AVM1 SWF 文件中设置 lockroot 属性,否则加载的子级的 _root 属性通常均为该 AVM1 SWF 文件。
  • AVM1 内容无法将文件加载到各级别。 例如,它无法通过调用 loadMovieNum("url", levelNum) 来加载文件。
  • 由 AVM2 SWF 文件加载的 AVM1 SWF 文件无法将其它 SWF 文件加载到 this。 也就是说,它无法向其自身加载其它 SWF 文件。 但是,由该 SWF 文件加载的子 Sprite 对象、MovieClip 对象或其它 AVM1 SWF 文件可以加载到 this

  不过最近在网上还是发现了两个东东可以实现两者的相互通信和方法调用,一个是
SWFBridge: Easier AS3 to AS2 Communication,另一个是FlashInterFace。两个网站上都有不错的事例,要是确实有这个需求的倒是可以看一下,不过Flash 8毕竟要成历史了。

博客又换新皮肤

  搞了一个整晚,终于给博客换了一个新皮肤,这个皮肤相比前一个少了不少图片,体积减少了不少,当然加载的速度也会有所提高了。风格嘛,我也蛮喜欢的。这次换皮肤离上一次还不到一个月,唉,看来我还是个喜新厌旧的人啊!哈哈!