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

ActionScript
FLASH AS3与网页JS参数值传递的问题
Flash AS3的parameters对象处理网页参数
Flash教程 认识Flash ActionScript的环境
Flash ActionScript编程基础
Flash AS3代码实现鼠标跟随喷枪涂鸦效果
falsh 跨域调用配置
Flash AS3.0 实例教程 喷泉动画特效
AS3 Loader与URLLoader的比较
ColorTransform类调整显示对象的颜色值
Flash AS3 快速制作烟雾动画
Flash AS3 制作文字飞出动画
ActionScript 学习小心得
ActionScript3.0读取网页FlashVars中的参数的问题
通过实例学习AS3.0:案例三
通过实例学习Flash AS3.0:案例四
通过实例学习Flash AS3.0:案例五
通过实例学习Flash AS3.0:案例六
Flash教程:认识Flash ActionScript的环境
Flash as入门(1):认识AS面板
Flash as入门(3):AS基本语法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-01   浏览: 334 ::
收藏到网摘: 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.}