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

二月 3rd, 2010 § 2

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

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: ,

§ 2 Responses to “忽略PNG图片透明区域鼠标事件”

  • alpha 说:

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

    • 破民 说:

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

  • § Leave a Reply

What's this?

You are currently reading 忽略PNG图片透明区域鼠标事件 at 破民.

meta