忽略PNG图片透明区域鼠标事件

2010年2月03日, 2 条评论

当加载外部图片的时候,希望鼠标只响应不透明区域的事件,可以试试下面的方法。

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
package {
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.LoaderInfo;
	import flash.net.URLRequest;
	import flash.events.Event;
	import flash.display.Loader;
	import flash.display.Sprite;
 
	/**
	 * @author Hank
	 * @blog http://www.po-min.com
	 * 2010-2-2
	 */
 
	[SWF(width="1000", height="600", backgroundColor="#FFFFFF", frameRate="40")]
 
	public class PNGMouse extends Sprite 
	{
		private var PNGLINK : String = "0.png";
 
		public function PNGMouse()
		{
			loadPNG();
		}
 
		private function loadPNG() : void
		{
			var loader : Loader = new Loader;
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onPNGLoaderInit);
			loader.load(new URLRequest(PNGLINK));
		}
 
		private function onPNGLoaderInit(e : Event) : void
		{
			var image : DisplayObject = LoaderInfo(e.currentTarget).content as DisplayObject;
			setButton(image);
		}
 
		private function setButton(image : DisplayObject) : void
		{
			var container : Sprite = new Sprite();
			container.buttonMode = true;
			addChild(container);
			container.addChild(image);
 
			var bmd : BitmapData = new BitmapData(image.width, image.height, true, 0x00000000);
			bmd.draw(image);
 
			//设置遮罩,遮罩后会忽略遮罩以外的鼠标事件
			var maskSp : Sprite = new Sprite();
			maskSp.graphics.beginFill(0x0000FF, .2);			
			container.addChild(maskSp);
 
			//设置点击区域,方便测试
			var hitSp : Sprite = new Sprite();
			hitSp.graphics.beginFill(0x0000FF, .2);			
			container.addChild(hitSp);
 
			//取有效像素位置
			/*-----------------------------------------------------
			 * 缺点:
			 *  一、如果图片大的话效率会比较低。
			 *  优化方式:
			 *  1、调整历遍的密度,从1px改成2px或4px,用精确度换取效率
			 *  2、如果很多图片同时进行的话,可以使用队列方式进行
			 * 	
			 *  二、半透明处边界判断问题(目前的判断方式只是排除完全透明处的橡树)
			 * 
			 *----------------------------------------------------*/
			for(var i : uint = 0;i < bmd.width; i++) {
				for(var j : uint = 0;j < bmd.height; j++) {
					if(bmd.getPixel32(i, j)) {
						maskSp.graphics.drawRect(i, j, 1, 1);
						hitSp.graphics.drawRect(i, j, 1, 1);
					}
				}
			}
 
			image.mask = maskSp;
		}
	}
}

希望对大家有用。

Tagged: ,

“忽略PNG图片透明区域鼠标事件” -- 有 2 条回复

  • alpha 说:

    建议博客的文章统统都显示在首页,点击进入很痛苦。
    再接再厉,博客的内容太少了,争取和你订阅的RSS一样多。

  • 破民 说:

    嘿嘿,谢谢你的建议,刚刚开始做这些,改PHP代码还有些吃力,慢慢充实内容的同时,再慢慢修正吧。订阅得多了,信息过载会很痛苦的。

  • 说点什么?

欢迎光临

你正在阅读 “忽略PNG图片透明区域鼠标事件” -- 破民.

摘要