当加载外部图片的时候,希望鼠标只响应不透明区域的事件,可以试试下面的方法。
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;
}
}
}
希望对大家有用。
建议博客的文章统统都显示在首页,点击进入很痛苦。
再接再厉,博客的内容太少了,争取和你订阅的RSS一样多。
嘿嘿,谢谢你的建议,刚刚开始做这些,改PHP代码还有些吃力,慢慢充实内容的同时,再慢慢修正吧。订阅得多了,信息过载会很痛苦的。