利用blendMode实现 Alpaha 通道遮罩

做项目遇到flash player的bug真的是很头疼,

 

    当本身或父容器的cacheAsBitmap   = true 时,就会对,该对象 的matrix 产生扰乱,就是取值设置不准确,这是    flash 的bug   http://bugs.adobe.com/jira/browse/FP-121

 

什么东西呢,就是

       

        A:   mask.png                   B:   frame.png                               C:    Image.*

       
                   

 

 

 几张图要实现这样的效果



 

 

自然就想到了用 flash的遮罩来实现。哦对了,其中mask.png还要做下补色,然后对frame.png和Image.*组成的图

进行apha遮罩,但是这样做会有个问题因为,对Image.*的操作是基于 matrix的,而alpha遮罩是要设置cacheAsBitmap = true 的,但是这样做会有我一开始提到的那个问题,虽然http://www.sephiroth.it/weblog /a ... heasbitmap_hell.php 上面给出了解决办法,但是我发现还是没有根本解决问题。怎么办勒,终于被我发现另外一种实现alpha通道遮罩的办法,而不用设置cacheAsBitmap=true,那就是用blendMode。将父层的blend设置为

BlendMode.LAYER,在将mask层放在被遮罩层上并设置blend = BlendMode.ALPHA,嘿嘿,一切都解决啦。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

package {
    import flash.display.BlendMode;
    import flash.events.MouseEvent;
    
    import mx.containers.Canvas;
    import mx.controls.Image;
    import mx.core.ScrollPolicy;
    import mx.core.mx_internal;
    use namespace mx_internal;
    
    public class BlendTestContainer extends Canvas {
        
        [Embed(source="testPicture.jpg")]
        private var testPictureClass:Class;
        
        [Embed(source="frameImage.png")]
        private var frameImageClass:Class;
        
        [Embed(source="maskImage.png")]
        private var maskImageClass:Class;
        
        public function BlendTestContainer() {
            _horizontalScrollPolicy = ScrollPolicy.OFF;
            _verticalScrollPolicy = ScrollPolicy.OFF;
            
            blendMode = BlendMode.LAYER;
        }
        
        private var testPicture:Image;
        private var frameImage:Image;
        private var maskImage:Image;
        
        override protected function createChildren():void {
            super.createChildren();
            
            if(!testPicture) {
                testPicture = new Image();
                testPicture.addEventListener(MouseEvent.MOUSE_DOWN,testPictureMouseDownHandler);
                testPicture.source = testPictureClass;
                addChild(testPicture);
            }
            
            if(!frameImage) {
                frameImage = new Image();
                frameImage.mouseEnabled = false;
                frameImage.mouseChildren = false;
                frameImage.maintainAspectRatio = false;
                frameImage.source = frameImageClass;
                addChild(frameImage);
            }
            
            if(!maskImage) {
                maskImage = new Image();
                maskImage.mouseEnabled = false;
                maskImage.mouseChildren = false;
                maskImage.maintainAspectRatio = false;
                maskImage.source = maskImageClass;
                maskImage.blendMode = BlendMode.ERASE;
                addChild(maskImage);
            }
        }
        
        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
            super.updateDisplayList(unscaledWidth,unscaledHeight);
            
            frameImage.setActualSize(unscaledWidth,unscaledHeight);
            maskImage.setActualSize(unscaledWidth,unscaledHeight);
        }
        
        private function testPictureMouseDownHandler(e:MouseEvent):void {
            testPicture.startDrag();
            this.stage.addEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler);
        }
        
        private function stageMouseUpHandler(e:MouseEvent):void {
            testPicture.stopDrag();
            this.stage.removeEventListener(MouseEvent.MOUSE_UP,stageMouseUpHandler);
        }
    }
}
 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值