
AS Code
package { import flash.display.Sprite; import flash.events.Event; import flash.display.Shape; import flash.text.TextField; [SWF(width = 550, height = 440, backgroundColor = 0xffffff, frameRate = 24)] /** * ... * @author spark.fandlr@gmail.com */ public class Main extends Sprite { private var _shape:Shape; private var an:Number = 0; private const r:Number = 50; private var _txt:TextField; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point _shape = new Shape; _shape.x = stage.stageWidth / 2; _shape.y = stage.stageHeight / 2; _txt = new TextField; _txt.x = _shape.x; _txt.y = _shape.y; addChild(_shape); addChild(_txt); addEventListener(Event.ENTER_FRAME, fdraw); } private function fdraw(event:Event):void { an ++; if (an >= 360) { removeEventListener(Event.ENTER_FRAME, fdraw); } else { drawShan(an); } } private function drawShan(angle:Number):void { _shape.graphics.clear(); _shape.graphics.lineStyle(2, 0x0000ff); _shape.graphics.beginFill(0xff0000, 0.5); var p:Number = angle / 180 * Math.PI; _shape.graphics.moveTo(0, 0); _shape.graphics.lineTo(r * Math.cos(p), -r * Math.sin(p)); var part:int = Math.floor(angle / 45); var remain:Number = angle - part * 45; var hp:Number = remain / 180 * Math.PI / 2; var hr:Number = Math.abs(r / Math.cos(hp)); _shape.graphics.curveTo(hr * Math.cos(p - hp), - hr * Math.sin(p - hp), r * Math.cos(p - hp * 2), - r * Math.sin(p - hp * 2)); switch(part) { case 7: _shape.graphics.curveTo(Math.tan(Math.PI / 8) * r, r , 0, r ); case 6: _shape.graphics.curveTo(-Math.tan(Math.PI/8)*r, r, -Math.sin(Math.PI/4) * r , Math.sin(Math.PI / 4) * r); case 5: _shape.graphics.curveTo(-r, Math.tan(Math.PI / 8) * r , -r , 0 ); case 4: _shape.graphics.curveTo( -r , -Math.tan(Math.PI/8)*r, -Math.sin(Math.PI/4) * r , -Math.sin(Math.PI / 4) * r ); case 3: _shape.graphics.curveTo( -Math.tan(Math.PI / 8) * r , -r , 0, -r); case 2: _shape.graphics.curveTo( Math.tan(Math.PI/8)*r, -r, Math.sin(Math.PI/4) * r , -Math.sin(Math.PI / 4) * r ); case 1: _shape.graphics.curveTo(r, -Math.tan(Math.PI/8)*r,r, 0 ); } _shape.graphics.lineTo(0, 0); _shape.graphics.endFill(); _txt.text = int(angle / 360 * 100).toString() + "%"; } } }
1、问题:Flash文件放在网页中,全屏后画面卡住,声音正常。
解决方法:在SWF上右键,在弹出菜单中选择“设置”,弹出框中,找到“使用图形加速”,把前面的勾去掉。
2、问题:在遨游浏览器中全屏后无法按Esc键退出全屏
解决方法:无
不要误会,这里并不解释MXML文件的基础意义,只是要说下它的作用和在生成编译的SWF时会发生的变化。
整个MXML文件就是一个Class!当你编写一个MXML文件并编译它的时候,Flex编译器会创建一个新类,并生成这个类要使用的ActionScript代码。
一个MXML应用程序(以<mx :Application>标签开始的文件)定义了Application类的子类。与之相似的,一个MXML组件(以组件标签开始的文件,比如<mx :Button>)定义了该组件的一个子类。子类的名字就是文件名。基类是顶级标签的类。
尽管在MXML文件里只写了一个<mx :Application>,而实际上是这样定义应用程序的:
class MyApp extends Application
在MyButton.mxml里以<mx :Button>开始,而本质上是像下面这样定义:
class MyButton extends Button
在<mx :Script>块里声明的变量和函数都被定义为子类的属性和方法。
当设置组件的id属性时,实际上是在最终生成的类里定义里公共变量,这个变量保存对该组件的引用。比如,如果<mx :Button id=”myButton” />标签内嵌在多个容器很深的地方,但你仍然可以使用myButton引用它。
事件属性最终变成了子类自动生成的事件监听器方法的函数体,比如:
<mx :Button id=”myButton” click=”foo = 1; doSomething()”>
变成了:
private function __myButton_click(event:MouseEvent):void {
foo = 1;
doSomething()
}
事件属性变成了方法体,因此它们可以访问子类的其他属性和方法。
明白以上这些很重要,它会帮助你理解为什么<mx :Script>块中只能放变量声明和函数,而不能直接写语句。
不能把主MXML文件的名字命名为内置方法、属性的名字!!!!!!!!!!!!!!比如由于describeType是flash.utils包里的方法,你的mxml文件绝不能命名为describeType!
用SoundMixer的computeSpectrum() 方法提取声音数据并制作一个频谱图形是件很不错的事情,但是它却存在一些问题。
[问题描述]
浏览器:IE7
系统:WinXPSP2
两个不同域中各有一个swf同样使用SoundMixer.computeSpectrum() 方法提取声音数据,
1、在IE7中单独打开上面两个中的任意一个含SWF的网页,频谱图形都很正常。
2、打开2个IE7,分别用来打开上面两个含SWF的网页,频谱图形也正常。
3、打开一个IE7,新建两个选项开,用来打开上面包含两个SWF的网页,频谱图形不正常,测试抓取错误时看到Security Error :#2121。
[简单分析]
SoundMixer.computeSpectrum() 是抓取应用程序中的当前播放的混合声音的数据。通过上面3种情况下的测试,可以推测,虽然是同一个IE应用程序中的不同选项卡中,但是SWF仍然认为是在同一个应用程序中。
这对我们不是一件好事,因为很多人希望开新选项卡(无论是IE中还是FireFox中),而不是开新的窗口,如果多个不相干的网页中都要使用SoundMixer.computeSpectrum() 做频谱图,那么最终结果是由于安全限制问题,谁都无法正常显示(当然,并不影响声音的正常播放,只是无法成功抓取声音原始数据而已)。就算是使用跨域策略解决了访问问题,但是现实是我们更希望SoundMixer.computeSpectrum() 抓取的是自己的SWF中播放的声音数据,而不是所有SWF中播放的声音数据
[如何解决]
computeSpectrum是静态方法,所以无法创建SoundMixer的实例来使用它。唉,想不到解决的办法。等待Adobe解决
无解决办法。
本文主要包含:1、什么是作用域;2、全局变量和局部变量;3、块级作用域
变量的作用域是指可以使用(或者说是引用)该变量的有效范围。一般来说,变量按作用域不同分为全局变量和局部变量。在任何函数和类之外定义的变量是全局变量,而在类和函数内定义的变量是局部变量。
全局变量也就是能在代码的任何地方都可使用的变量,而局部变量只能在定义它的类或函数内使用。这样可能遇到的一个问题是,如果定义的全局变量和在某个函数内定义的局部变量名字一样的时候,会产生什么影响?这时,在局部变量的作用域内,局部变量会屏蔽全局变量!
另外一个是关于块级作用域,块级作用域指的是{}之内的代码。在C++和Java中都用块级作用域的限制,也就是说在代码块内的定义的变量的作用域仅限于改代码块。但是ActionScript并无此限制!不但如此,有趣的一点是,ActionScript中还存在一种名为“提升”的方法,编译器会自动把变量定义的语句移到函数顶部!也就是说在函数内,你可以先使用某个变量,哪怕是在函数结束前一行再定义它也是可以的,比如下面的语句
执行该代码的结果是:
可以看到虽然是在后面才定义的sss,但是之前的trace是有效的。