var txt:TextField = new TextField(); txt.blendMode = BlendMode.LAYER; txt.alpha = .2; txt.appendText("这里文字透明咯~"); addChild(txt);
var txt:TextField = new TextField(); txt.blendMode = BlendMode.LAYER; txt.alpha = .2; txt.appendText("这里文字透明咯~"); addChild(txt);
在AS3中,监听事件,比如:
**.addEventListener(Event.COMPLETE,hander);
function hander(event:Event):void
很多时候要向这个hander方法里传递参数。使程序更灵活。
下面有一个简单的方法:
**.addEventListener(Event.ENTER_FRAME,function(e:Event){ hander2(e,12,6); });//比如要传“12”“6”这个参数 hander2如下: function hander2(event:Event,i:int,j:int):void { if ((event.target as MovieClip).currentFrame == i) { event.target.gotoAndPlay(j); } }
正文:
对于如下的一个XML文档,在flash中应该怎么读呢?
(图片来自kirupa.com)
按照Using XML in Flash CS3/AS3上的内容,包括了XML结构介绍等内容,在此我不再转述,对XML不怎么了解的话请先移步:XML 系列教程。
这里我分三步描述flash读XML的基本方法,以及外延一个对带命名空间的XML的读取方法,如下目录:
1、加载XML文件;
2、读取XML的数据;
3、过滤数据;
4、读取带命名空间的XML数据;
5、处理gb2312编码的XML;
注:在这里的AS脚本都是在 Adobe Flash CS3 版本以上中进行编写,flex用户请自行添加修改相应的包引用。
下面开始第一部分,如何加载XML文件!
在脚本编辑器中写入以下代码:
var xmlLoader:URLLoader = new URLLoader(); var xmlData:XML = null; xmlLoader.addEventListener(Event.COMPLETE, LoadXML); xmlLoader.load(new URLRequest("http://www.kirupa.com/net/files/sampleXML.xml")); function LoadXML(e:Event):void { xmlData = new XML(e.target.data); trace(xmlData); }
按Ctrl+Enter运行它,你会在输出窗口中看到整个XML的内容:

这里不进行代码解说,关于XML类,请查看:http://help.adobe.com/zh_TW/AS3LCR/Flash_10.0/XML.html
下面进入第2部分:如何读取XML数据。
对XML数据的读取是十分简单的,不信请看:
function LoadXML(e:Event):void { xmlData = new XML(e.target.data); ParseBooks(xmlData); } function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); trace(bookInput.Book); }
可得到如何结果:
XML Output ------------------------ Sir Arthur Conan Doyle F. Scott Fitzgerald Stephen E. Ambrose Stephen E. Ambrose
同样的,把trace的内容改为bookInput.Book.author,会得到下面的结果:
XML Output ------------------------ Sir Arthur Conan Doyle F. Scott Fitzgerald Stephen E. Ambrose Stephen E. Ambrose
而trace(bookInput.Book.author.text());可得到:
XML Output ------------------------ Sir Arthur Conan DoyleF. Scott FitzgeraldStephen E. AmbroseStephen E. Ambrose
同样的,要读具体的节点,可以这样
trace(bookInput.Book.author.text()[0]);
可得到
XML Output ------------------------ Sir Arthur Conan Doyle
这里我们会用到另外一个类XMLList,这个类可以把XML对象作为数组的方式读取,可以方便地进行for each操作。
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var authorList:XMLList = bookInput.Book.author; for each (var authorElement:XML in authorList) { trace(authorElement); } }
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var bookChildren:XMLList = bookInput.Book.children(); for each (var bookInfo:XML in bookChildren) { trace(bookInfo); } }
结果如下:
XML Output ------------------------ Sherlock Holmes: Complete Novels and Stories, Vol 1 Sir Arthur Conan Doyle The Great Gatsby F. Scott Fitzgerald Undaunted Courage Stephen E. Ambrose Nothing Like It In the World Stephen E. Ambrose
同样的,我们可以用节点的.name()方法得知它的标签名:
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var bookChildren:XMLList = bookInput.Book.children(); for each (var bookInfo:XML in bookChildren) { if (bookInfo.name() == "author") { trace(bookInfo); } } }
这样就可以得到所有author的值了。
历遍属性的方法:
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var bookAttributes:XMLList = bookInput.Book.attributes(); for each (var bookISBN:XML in bookAttributes) { trace(bookISBN); } }
对于attributes,同样有一个.name()方法:
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var bookAttributes:XMLList = bookInput.Book.attributes(); for each (var bookISBN:XML in bookAttributes) { if (bookISBN.name() == "ISBN") { trace(bookISBN); } } }
另外还有一种更直接的方法,直接用.attribute(“ISBN”) :
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var bookAttributes:XMLList = bookInput.Book.attribute("ISBN"); for each (var bookISBN:XML in bookAttributes) { trace(bookISBN); } }
注意,这个.attribute(attributeName:*)方法不是.attributes()哦,少了个s的哦。
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var authorList:XMLList = bookInput.Book.(author == "Stephen E. Ambrose"); trace(authorList); }
可得到:
XML Output ------------------------ <Book ISBN="0684826976"> <title>Undaunted Courage</title> <author>Stephen E. Ambrose</author> </Book> <Book ISBN="0743203178"> <title>Nothing Like It In the World</title> <author>Stephen E. Ambrose</author> </Book>
所以在过滤之后,可以同样使用
var authorList:XMLList = bookInput.Book.(author == "Stephen E. Ambrose").title;
得到所有作者是Stephen E. Ambrose的书名了。
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var bookList:XMLList = bookInput.Book.(@ISBN == "0743203178").title; trace(bookList); }
我们还可以进行一些复杂的过滤:
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var bookList:XMLList = bookInput.Book.(author == "Stephen E. Ambrose" && title != "Nothing Like It In the World").title; trace(bookList); }
如果把上面的XML文件改一改,变成如下:
<Books xmlns:g="http://guitarbean.com/"> <Book ISBN="0553212419"> <title>Sherlock Holmes: Complete Novels and Stories, Vol 1</title> <author>Sir Arthur Conan Doyle</author> </Book> <Book ISBN="0743273567"> <title>The Great Gatsby</title> <author>F. Scott Fitzgerald</author> </Book> <Book ISBN="0684826976"> <title>Undaunted Courage</title> <author>Stephen E. Ambrose</author> </Book> <Book ISBN="0743203178"> <title>Nothing Like It In the World</title> <author>Stephen E. Ambrose</author> <g:cost>XXXXXXX</g:cost> </Book> </Books>
这时要用到Namespace类了:
function ParseBooks(bookInput:XML):void { trace("XML Output"); trace("------------------------"); var g:Namespace = new Namespace("http://guitarbean.com/"); trace(bookInput.Book.g::cost); }
可得到:
XML Output ------------------------ XXXXXXX
这里的双冒号(::)就是命名空间符,只要建立了一Namespace对象,XML对象便可直接用点运算符来操作了,相对的比较方便。
有的XML文件可能不是UTF8的,如在中国常用的gb2312编码,侧需要转码一下,这时要用到ByteArray类,在建立XML对象前统一处理下即可:
var xmlLoader:URLLoader = new URLLoader(); var xmlData:XML = null; xmlLoader.addEventListener(Event.COMPLETE, LoadXML); xmlLoader.load(new URLRequest("http://www.kirupa.com/net/files/sampleXML.xml")); function LoadXML(e:Event):void { var BA:ByteArray = new ByteArray; BA.writeBytes((e.target as URLLoader).data); BA.position = 0; //把gb2312转为UTF8编码:从字符集中读取字符串 var newData:String = BA.readMultiByte(BA.length,"gb2312"); //然后才建立XML对象: xmlData = new XML(newData); trace(xmlData); }
或写个方法
public function DecodeFrom(_arg1:ByteArray):ByteArray{
var _local2:ByteArray;
_local2 = new ByteArray();
_arg1.position = 0;
while (_local2.length < _arg1.length) {
_local2.writeByte(uint((Number(_arg1.readUnsignedByte()) ^ password)));
};
return (_local2);
}
LoadXML中这样写:
xmlData = new XML(DecodeFrom(BA);
trace(xmlData);
想让图片和文字垂直居中对齐的话,可以在IMG标签下添加align=absmiddle属性即可实现,但align=absmiddle属性在W3C验证下通不过,但可以用CSS来代替IMG的align=absmiddle属性来实现垂直居中。
可以在CSS中加入vertical-align:middle;就能实现了
EA(Enterprise Architect)是支持多种流行语言脚本双向工程的UML建模工具。更难得的是,它还支持AS3,今天谈一谈怎样从AS3代码生成EA类图。
一、准备
下载安装EA:http://www.sparxsystems.com.au/products/ea_downloads.html。
二、操作步骤
点击此处查看动画演示。
三、说明
//向右旋转90度 public function scaleRight(bmp:BitmapData):BitmapData{ var m:Matrix = new Matrix(); m.rotate(Math.PI/2); m.translate(bmp.height,0); var bd:BitmapData = new BitmapData(bmp.height, bmp.width,false); bd.draw(bmp,m); return bd; } //向左旋转90度 public function scaleLeft(bmp:BitmapData):BitmapData{ var m:Matrix = new Matrix(); m.rotate(-Math.PI/2); m.translate(0,bmp.width); var bd:BitmapData = new BitmapData(bmp.height, bmp.width,false); bd.draw(bmp,m); return bd; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import fl.controls.UIScrollBar; import fl.controls.SliderDirection;//滑动条的方向 var outText:URLRequest=new URLRequest("UIScrollBarText.txt"); var inText:URLLoader=new URLLoader(); inText.load(outText); inText.addEventListener(Event.COMPLETE,completeFun); function completeFun(e:Event) { var bl:URLVariables=new URLVariables(inText.data); text1.text=bl.a2;//部分载入 //text1.text=inText.data;//载入全部文本 } var newUIScrollBar:UIScrollBar=new UIScrollBar(); addChild(newUIScrollBar); with (newUIScrollBar) { x=text1.x+text1.width; y=text1.y; height=text1.height; direction=SliderDirection.VERTICAL; scrollTarget=text1; } |
在库里面导入NumericStepper组件
舞台上有一个label组件,实例名称:newLabel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import fl.controls.NumericStepper; var style:TextFormat=new TextFormat();//字符样式 style.color=0x0000FF; style.font="宋体"; var newNumericStepper:NumericStepper=new NumericStepper(); addChild(newNumericStepper); with (newNumericStepper) { x=100; y=100; maximum=30;//最大值 minimum=12;//最小值 stepSize=1;//每按一下按钮,增加或减少的数值 value=12;//初始值或当前值 } newNumericStepper.addEventListener(Event.CHANGE,changefun); function changefun(e:Event) { style.size=newNumericStepper.value; newLabel.setStyle("textFormat",style); } |
在库里面导入RadioButton组件
舞台上面两个label组件,实例名称分别为label1和label2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | import fl.controls.RadioButton; import fl.controls.RadioButtonGroup;//单选按钮的分组 import fl.controls.ButtonLabelPlacement;//字在按钮图标的左边还是右边或上下 var rbg1:RadioButtonGroup=new RadioButtonGroup("group1"); var rbg2:RadioButtonGroup=new RadioButtonGroup("group2"); var btn1:RadioButton=new RadioButton(); var btn2:RadioButton=new RadioButton(); var btn3:RadioButton=new RadioButton(); var btn4:RadioButton=new RadioButton(); var btn5:RadioButton=new RadioButton(); var btn6:RadioButton=new RadioButton(); for (var i:int=1; i<=3; i++) { addChild(this["btn"+i]); with (this["btn"+i]) { x+=50+100*i; y=100; label="选项"+i; //两种办法分组: group=rbg1;//第一种(推荐):按钮的分组,此 RadioButton 所属的RadioButtonGroup对象 //groupName="分组1";//第二种:直接写,这样就不用上面导入RadioButtonGroup了 value="按的是选项"+i;//单选按钮所代表的值 labelPlacement=ButtonLabelPlacement.RIGHT;//字在按钮图标的左边还是右边或上下 } } for (var j:int=4; j<=6; j++) { addChild(this["btn"+j]); with (this["btn"+j]) { x+=20+100*(j-3); y=300; label="选项"+j; group=rbg2; value="按的是选项"+j; labelPlacement=ButtonLabelPlacement.LEFT; } } //第一种判断办法 btn1.addEventListener(MouseEvent.CLICK,clickFun1); btn2.addEventListener(MouseEvent.CLICK,clickFun1); btn3.addEventListener(MouseEvent.CLICK,clickFun1); btn4.addEventListener(MouseEvent.CLICK,clickFun2); btn5.addEventListener(MouseEvent.CLICK,clickFun2); btn6.addEventListener(MouseEvent.CLICK,clickFun2); function clickFun1(e:MouseEvent) { label1.text=e.target.value; } function clickFun2(e:MouseEvent) { label2.text=e.target.value; } //第二种判断办法 /* btn1.addEventListener(Event.ENTER_FRAME,clickFun1); btn2.addEventListener(Event.ENTER_FRAME,clickFun1); btn3.addEventListener(Event.ENTER_FRAME,clickFun1); btn4.addEventListener(Event.ENTER_FRAME,clickFun2); btn5.addEventListener(Event.ENTER_FRAME,clickFun2); btn6.addEventListener(Event.ENTER_FRAME,clickFun2); function clickFun1(e:Event) { if (e.target.selected) { label1.text=e.target.value; } } function clickFun2(e:Event) { if (e.target.selected) { label2.text=e.target.value; } }*/ |
在库里面导入ScrollPane组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import fl.containers.ScrollPane; import fl.controls.ScrollPolicy;//滚动条 var newScrollPane:ScrollPane=new ScrollPane(); addChild(newScrollPane); with (newScrollPane) { x=100; y=50; width=400; height=300; source=mc;//加载的路径 scrollDrag=true;//当鼠标移到画面上时,是否允许移动图片,默认是false不允许 horizontalLineScrollSize=5;//单击两边的左右移动按钮,横向滚动条一次移动多少像素 horizontalPageScrollSize=10;//单击横向滚动条空白处时,滚动条移动多少像素 horizontalScrollPolicy=ScrollPolicy.ON;//是否显示横向滚动条 verticalLineScrollSize=5;//单击垂直方向,上下移动按钮,竖滚动条一次移动多少像素 verticalPageScrollSize=10;//单击垂直滚动条空白处时,滚动条移动多少像素 verticalScrollPolicy=ScrollPolicy.AUTO;//是否显示垂直滚动条 } |
最新评论