下面的例子演示遮罩跟随鼠标移动。通过载入的图片指定遮罩,该遮罩跟着鼠标移动:
1 2 3 4 5 6 7 8 9 10 11 | var loader:Loader = new Loader( ); loader.load(new URLRequest("image.jpg")); addChild(loader); var maskSprite:Sprite = new Sprite( ); maskSprite.graphics.lineStyle( ); maskSprite.graphics.beginFill(0xFFFFFF); maskSprite.graphics.drawCircle(0, 0, 50); maskSprite.graphics.endFill( ); loader.mask = maskSprite; addChild(maskSprite); maskSprite.startDrag(true); |
下面的例子通过URL载入位图,拷贝到BitmapData对象上,使用BitmapData对象填充圆:
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 | package { import flash.display.Sprite; import flash.geom.Matrix; import flash.display.Loader; import flash.net.URLRequest; import flash.display.BitmapData; import flash.events.Event; public class Drawing extends Sprite { private var _loader:Loader; public function Drawing( ) { _loader = new Loader( ); _loader.load(new URLRequest("image.jpg")); _loader.contentLoaderInfo.addEventListener (Event.COMPLETE, onImageLoad); } private function onImageLoad(event:Event):void { var bitmap:BitmapData = new BitmapData (_loader.width, _loader.height); bitmap.draw(_loader, new Matrix( )); var matrix:Matrix = new Matrix( ); matrix.scale(.1, .1); var sampleSprite:Sprite = new Sprite( ); sampleSprite.graphics.lineStyle( ); sampleSprite.graphics.beginBitmapFill(bitmap, matrix); sampleSprite.graphics.drawCircle(100, 100, 100); sampleSprite.graphics.endFill( ); addChild(sampleSprite); } } } |
下面的代码使用这些方法建立了简单的拖动效果。有三个不同颜色的矩形,右边有个白色的矩形作为拖动的目标,当拖动左边的矩形到白色矩形上时,松开鼠标,白色矩形就会i改变相应颜色。
代码:
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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | package { import flash.display.Sprite; import flash.display.DisplayObject; import flash.events.MouseEvent; import flash.geom.Point; import flash.filters.DropShadowFilter; public class ColorDrop extends Sprite { private var _red:Sprite; private var _green:Sprite; private var _blue:Sprite; private var _white:Sprite; // 保存被拖动对象原始坐标 private var startingLocation:Point; // 创建矩形和添加事件 public function ColorDrop( ) { createRectangles( ); addEventListeners( ); } private function createRectangles( ):void { _red = new Sprite( ); _red.graphics.beginFill( 0xFF0000 ); _red.graphics.drawRect( 0, 10, 10, 10 ); _red.graphics.endFill( ); _green = new Sprite( ); _green.graphics.beginFill( 0x00FF00 ); _green.graphics.drawRect( 0, 30, 10, 10 ); _green.graphics.endFill( ); _blue = new Sprite( ); _blue.graphics.beginFill( 0x0000FF ); _blue.graphics.drawRect( 0, 50, 10, 10 ); _blue.graphics.endFill( ); _white = new Sprite( ); _white.graphics.beginFill( 0xFFFFFF ); _white.graphics.drawRect( 20, 10, 50, 50 ); _white.graphics.endFill( ); addChild( _red ); addChild( _green ); addChild( _blue ); addChild( _white ); } private function addEventListeners( ):void { _red.addEventListener( MouseEvent.MOUSE_DOWN, pickup ); _red.addEventListener( MouseEvent.MOUSE_UP, place ); _green.addEventListener( MouseEvent.MOUSE_DOWN, pickup ); _green.addEventListener( MouseEvent.MOUSE_UP, place ); _blue.addEventListener( MouseEvent.MOUSE_DOWN, pickup ); _blue.addEventListener( MouseEvent.MOUSE_UP, place ); } public function pickup( event:MouseEvent ):void { // 保存原始坐标以便回位 startingLocation = new Point( ); startingLocation.x = event.target.x; startingLocation.y = event.target.y; //开始拖动,给被拖动对象加上阴影 event.target.startDrag( ); event.target.filters = [ new DropShadowFilter( ) ]; // 把被拖动对象显示在最前面 setChildIndex( DisplayObject( event.target ), numChildren - 1 ); } public function place( event:MouseEvent ):void { // 停止拖动,取消阴影效果 event.target.stopDrag( ); event.target.filters = null; // 检测是否已经被拖动到白色矩形上 if (event.target.dropTarget==_white) { // 设置颜色 var color:uint; switch (event.target) { case _red : color = 0xFF0000; break; case _green : color = 0x00FF00; break; case _blue : color = 0x0000FF; break; } _white.graphics.clear( ); _white.graphics.beginFill( color ); _white.graphics.drawRect( 20, 10, 50, 50 ); _white.graphics.endFill( ); } // 把被拖动对象放回原位 event.target.x = startingLocation.x; event.target.y = startingLocation.y; } } } |
下面的完整例子通过一个绘图程序演示了各种鼠标事件,无论何时鼠标按下,绘图将立即开始,当移动鼠标,一条线跟着鼠标显示出来,当松开鼠标,绘图终止:
例子代码:
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 | package { import flash.display.Sprite; import flash.events.MouseEvent; public class DrawingDemo extends Sprite { // Flag to indicate whether the mouse is in draw mode private var _drawing:Boolean; public function DrawingDemo( ) {// 设置线条样式 graphics.lineStyle( 2, 0xFF0000 ); // 按住鼠标就绘图 _drawing = false; // 监听鼠标事件 stage.addEventListener( MouseEvent.MOUSE_DOWN, startDrawing ); stage.addEventListener( MouseEvent.MOUSE_MOVE, draw ); stage.addEventListener( MouseEvent.MOUSE_UP, stopDrawing ); } public function startDrawing( event:MouseEvent ):void { // 绘制起点 graphics.moveTo( mouseX, mouseY ); _drawing = true; } public function draw( event:MouseEvent ):void { if (_drawing) { // 鼠标走到哪画到哪 graphics.lineTo( mouseX, mouseY ); } } public function stopDrawing( event:MouseEvent ):void { _drawing = false; } } } |
摘自:ActionScript 3.0 Cookbook
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package { import flash.display.*; import flash.net.URLRequest; public class LoaderExample extends Sprite { public function LoaderExample() { // 1. 创建Loader 类实例 var loader:Loader=new Loader ; // 2. 添加到可视化对象列表 addChild(loader); // 3. 调用load( )方法 loader.load(new URLRequest("image.jpg")); } } } |
解决办法
Loader类载入.swf文件,然后通过Loader实例的content 属性访问
ExternalMovie代码:
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 | package { import flash.display.Sprite; import flash.display.Shape; public class ExternalMovie extends Sprite { private var _color:uint=0x000000; private var _circle:Shape; public function ExternalMovie() { updateDisplay(); } private function updateDisplay():void { // 如果circle 没有创建则创建之并显示 if (_circle == null) { _circle=new Shape ; addChild(_circle); } // 清除以前画的内容重新画并填充之 _circle.graphics.clear(); _circle.graphics.beginFill(_color); _circle.graphics.drawCircle(100,100,40); } // 改变颜色 public function setColor(color:uint):void { _color=color; updateDisplay(); } // 获取颜色 public function getColor():uint { return _color; } } } |
appendChild(child:object):XML:在当前子元素列表之后添加。
prependChild(child:object):XML:在当前子元素列表之前添加。
insertChildAfter(child1:object, child2:object):*:在子元素child1之后添加
insertChildBefore(child1:object, child2:object):*:在子元素child1之前添加
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var foo:XML = <data/> foo.appendChild(<d>dd</d>); trace(foo); foo.prependChild(<b>bbb</b>); trace(foo); var cNode:XML = <c>ccc</c>; foo.insertChildAfter(foo.b, cNode); trace(foo); var aNode:XML = <a>aaa</a>; foo.insertChildBefore(foo.b, aNode); trace(foo); |
1.如何使用双引号(..),访问当前元素的所有子元素
2.如何使用通配符(*)访问
3.如何使用表达式制定查找子元素的条件
4.如何使用标点制定查找属性的条件
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var kingdaXML:XML = 150000 100000 50000 //用法1:访问所有名为pageview的子节点,包括不同层次 trace(kingdaXML..pageview); //用法2:查找site子元素的属性,返回一个XMLlist对象,并用toXMLString()方法输出 trace(kingdaXML.site.@*.toXMLString()); //方法3:查找值小于100 000的pageview子元素 //这里100 000已被自动转换成数值类型 trace(kingdaXML.site.(pageview < 100000)); //用法4:查找site子元素中属性等于ActionScript 3的节点 trace(kingdaXML.site.(@name == "ActionScript 3")); |
AS3操作XML比AS2爽快的不是一个等级,不在需要写什么childNodes,也不需要什么Xpath…
例子:
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 | //使用运算符访问XML子元素和属性 var kingdaXML:XML = <websites> <site name="kingda's blog" url="http://www.design-studio.cn/"> <pageview>100</pageview> </site> <site name="actionScript 3" url="http://www.actionscript3.cn/"> <pageview>200</pageview> </site> </websites> trace(kingdaXML.site.pageview); trace(kingdaXML.site); trace(kingdaXML.site[0]); trace(kingdaXML.site[1]); trace(kingdaXML.site.@name); trace(kingdaXML.site.@name[0]); //使用“.”与@直接修改XML对象 kingdaXML.site[0].pageview = 200000; trace(kingdaXML.site[0]); kingdaXML.site[0].@name = "Kingda's first blog"; trace(kingdaXML.site[0]); //使用“.”与@直接添加子元素和属性 kingdaXML.site[0].author = new XML(); //添加一个空白节点 kingdaXML.site[0].location = "Hangzhou, China";//以字符串添加一个子节点 kingdaXML.site[0].weekvisit = [1000,2000,3000,4000];//用数组添加一个子节点 kingdaXML.site[0].@language = "Chinese"; trace(kingdaXML.site[0]); //使用“.”与@删除子元素和属性 delete kingdaXML.site[0].author; delete kingdaXML.site[0].location; delete kingdaXML.site[0].weekvisit; delete kingdaXML.site[0].@language; trace(kingdaXML.site[0]); |
为了便于测试代码,可以注释掉部分代码