AS3简单遮罩效果

下面的例子演示遮罩跟随鼠标移动。通过载入的图片指定遮罩,该遮罩跟着鼠标移动:

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);
		}
	}
}

下载示例代码

as3鼠标行为-拖动

下面的代码使用这些方法建立了简单的拖动效果。有三个不同颜色的矩形,右边有个白色的矩形作为拖动的目标,当拖动左边的矩形到白色矩形上时,松开鼠标,白色矩形就会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

AS3动态载入外部图片

例:

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"));
		}
	}
}

AS3 载入外部swf文件并与之交互

解决办法
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;
		}
	}
}

……
read more...

用API控制插入XML子元素的位置

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);

AS3简单方便地搜索XML子元素和属性

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 &lt; 100000));
 
//用法4:查找site子元素中属性等于ActionScript 3的节点
trace(kingdaXML.site.(@name == "ActionScript 3"));

AS3使用运算符操作XML数据

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]);

为了便于测试代码,可以注释掉部分代码