当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > 加载PNG后其透明区域不响应事件

ActionScript
FLASH 3D相册之利用BitmapData类制作
Flash 脚本游戏开发教程 第一课
Flash 脚本游戏开发教程第二课
Flash 脚本游戏开发教程第三课
Flash 脚本游戏开发教程第四课
Flash 脚本游戏开发教程第五课
Flash 脚本游戏开发教程第六课
Flash 脚本游戏开发教程第七课
Flash 脚本游戏开发教程第八课
Flash AS实现的蝌蚪摆尾动画的教程
从基础开始深入学Flash AS3教程(4)(译文)
从基础开始深入学Flash AS3教程(5)(译文)
从基础开始深入Flash AS3教程(2)(译文)
从基础开始深入学Flash AS3教程(3)(译文)
Flash AS3对单个图片进行角色动作化处理
从基础开始深入Flash AS3教程(1)(译文)
Flash教程:if条件语句的用法
Flash AS教程:_visible属性的详细讲解
Flash AS教程:图片环绕旋转效
Flash教程:trace()的使用

ActionScript 中的 加载PNG后其透明区域不响应事件


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-01   浏览: 327 ::
收藏到网摘: n/a

有时候我们希望加载PNG后其透明区域不响应事件..

网上的一般的方法为~
先获取其bitmapData对象..

当进行点击操作时使用..
bitmapData.getPixel32(x,y)获取..
点击位置的是否透明..
然后再操作...

而mosueOver与mouseOut等事件稍为复杂点..
需要侦听mouseMove..
然后对经过的坐标进行透明判断~~再抛出相应的事件...

今天介绍的方法原理跟上面差不多..
不过我们使用Sprite的另一个属性hitArea..(关于hitArea的说明请查看这里)
在图像加载完毕后..
先绘制一个去除了透明部份的Sprite..
然后把该Sprite指定为源对象的hitArea..

先看看效果: 


代码也很简单:main.mxml
 
01.<?xml version="1.0" encoding="utf-8"?>
02.<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*">
03.    <mx:Script>
04.        <![CDATA[
05.            import mx.managers.CursorManager;
06.            private function abc(e:MouseEvent):void
07.            {
08.                if(e.type == "mouseOver")
09.                {
10.                    CursorManager.setBusyCursor();
11.                }else
12.                {
13.                    CursorManager.removeBusyCursor();
14.                }
15.            }
16.        ]]>
17.    </mx:Script>
18.    <local:MyImage source="/UploadTeach/200908/20090811213244572.png" mouseOver="abc(event)" mouseOut="abc(event)"  y="25"/>
19.    <mx:Image source="/UploadTeach/200908/20090811213244572.png" mouseOver="abc(event)" mouseOut="abc(event)"  x="344" y="25"/>
20.</mx:Application>

MyImage.as,自定义Image类..
 
01.package
02.{
03.    import flash.display.BitmapData;
04.    import flash.display.DisplayObject;
05.    import flash.display.Sprite;
06.    import flash.events.Event;
07.    import flash.geom.Matrix;
08.    import flash.utils.setTimeout;
09.      
10.    import mx.controls.Image;
11.    /**
12.     * 自定义Image类,使之忽略PNG透明区域 
13.     * @author L4cd.Net
14.     */  
15.    public class MyImage extends Image
16.    {
17.        private var ht:Sprite = new Sprite();
18.        public function MyImage()
19.        {
20.            addChild(ht);
21.            hitArea = ht;
22.            //指定hitArea为ht对象
23.            ht.visible = false;
24.            ht.mouseEnabled = false;
25.            mouseChildren = false;
26.            addEventListener(Event.COMPLETE,complete,false,99,true);
27.            setTimeout(update,50)
28.        }
29.        private function complete(e:Event):void
30.        {
31.            setTimeout(update,50)
32.        }
33.        private function update():void
34.        {
35.            if(!content)return;
36.            var loader:DisplayObject = content.parent as DisplayObject;
37.            var bit:BitmapData = new BitmapData(loader.width,loader.height,true,0x00000000);
38.            var mat:Matrix = new Matrix();
39.            mat.scale(loader.scaleX,loader.scaleY);
40.            bit.draw(loader,mat);
41.            //重绘图象到bit
42.            ht.graphics.clear();
43.            ht.graphics.beginFill(0);
44.            for(var x:uint=0;x<bit.width;x++)
45.            {
46.                for(var y:uint=0;y<bit.height;y++)
47.                {
48.                    if(bit.getPixel32(x,y))ht.graphics.drawRect(x,y,1,1);
49.                }
50.            }
51.            //以graphics画出bit的无透明区域
52.            ht.graphics.endFill();
53.        }
54.    }
55.}