前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用threshold实现的遮罩引导

利用threshold实现的遮罩引导

作者头像
meteoric
发布2018-11-16 15:26:57
5810
发布2018-11-16 15:26:57
举报
文章被收录于专栏:游戏杂谈游戏杂谈

点击“开始引导”,则进入引导操作。除指定的按钮可以操作外,其它区域均不可点击。这种应用当新功能或是新产品上线后,用来引导用户来使用产品/功能,是十分有用的。facebook也有类似的引导,方法也很简单:用4个绝对定位的DIV(指定一个背景 + 一定透明度)遮住其它部分,这样可以被操作的区域就“留空”出来。

用flash实现上面的效果(比如在一个网页游戏中,使用此方法引导新手操作游戏),用BitmapData类的threshold方法是比较容易做到上面这个效果的。

threshold共有8个参数,其中前5个参数为必须要传入的。

threshold(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, operation:String, threshold:uint, color:uint = 0, mask:uint = 0xFFFFFFFF, copySource:Boolean = false):uint

利用InteractivePNG可“穿透”点击的特性,构建一个指定区域布满整个舞台大小的白色非透明的Bitmap,在另外一个层,创建一个指定大小、位置的“引导框”(注意要设置为透明),然后使用前面创建的Bitmap与“引导框”进行色值比较,符合要求的就使用另外一种颜色填充(使用透明进行填充,例如:0x00FFFFFF),这样满足条件的“引导框”位置的地方就被“透明”了。

示例的核心的代码:

代码语言:javascript
复制
package
{
    import com.mosesSupposes.bitmap.InteractivePNG;
    
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.geom.ColorTransform;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    
    import mx.core.Application;
    import mx.core.UIComponent;
    import mx.effects.Fade;
    
    public class AppGuideMaskUIComponent extends UIComponent
    {
        
        private var line_UI:UIComponent;
        private var ui:InteractivePNG;
        private var temp_movie:Sprite;
        private var fade:Fade;
        
        public function AppGuideMaskUIComponent()
        {
            super();
            
            this.mouseEnabled  = false;
            this.mouseChildren = true;
            
            ui = new InteractivePNG();
            ui.alpha = 0.6;
            ui.mouseChildren = false;
            addChild(ui);
            
            line_UI = new UIComponent();
            line_UI.mouseChildren = false;
            line_UI.mouseEnabled  = false;
            addChild(line_UI);
            
            temp_movie = new Sprite();
            temp_movie.mouseChildren = false;
            temp_movie.mouseEnabled = false;
            addChild(temp_movie);
            
            //动画闪烁
            fade = new Fade();
            fade.target = line_UI;
            fade.duration = 1000;
            fade.repeatCount = 0;
        }
        
        /**
         * 初始化引导框 
         * 
         * @param x
         * @param y
         * @param w
         * @param h
         * 
         */        
        public function initView(x:Number, y:Number, w:Number, h:Number):void
        {
            clear();
            
            createMask(x, y, w, h);
            
            inverseMask();
            
            ui.drawBitmapHitArea();
            ui.enableInteractivePNG();
            
            startFade();
        }
        
        private function createMask(x:Number, y:Number, w:Number, h:Number):void
        {
            var _x:Number = x;
            var _y:Number = y;
            var _w:Number = w;
            var _h:Number = h;
            
            var sprite:Sprite = new Sprite();
                sprite.x = _x;
                sprite.y = _y;
                sprite.graphics.beginFill(0xFFFFFF, 1);
                sprite.graphics.drawRect(0, 0, _w, _h);
                
            temp_movie.addChild(sprite);
            
            //勾勒红色提示框
            line_UI.graphics.clear();
            line_UI.graphics.lineStyle(3, 0xFF0000, 1);
            line_UI.graphics.moveTo(_x, _y);
            line_UI.graphics.lineTo(_x + _w, _y);
            line_UI.graphics.lineTo(_x + _w, _y + _h);
            line_UI.graphics.lineTo(_x, _y + _h);
            line_UI.graphics.lineTo(_x, _y);
        }
        
        /**
         * 创建遮罩 
         * 
         */        
        private function inverseMask():void
        {
            var _w:Number = Application.application.width;
            var _h:Number = Application.application.height;
            
            var _bmp:BitmapData = new BitmapData(_w, _h, true, 0xFFFFFFFF);
            
            var transform:ColorTransform = new ColorTransform(0, 0, 0, 1);
            var matrix:Matrix = new Matrix();
                matrix.translate(temp_movie.x, temp_movie.y);
            
            _bmp.draw(temp_movie, matrix, transform);
            //使用白色进行检测,色值小于白色色值的将被设置为透明    http://www.liuhuan.com/blog/article.asp?id=1081
            _bmp.threshold(_bmp, new Rectangle(0, 0, _bmp.width, _bmp.height), new Point(0, 0), "<", 0xFFFFFFFF, 0x00FFFFFF);

            clear();
            
            var tempBmp:Bitmap = new Bitmap(_bmp);
            ui.addChild(tempBmp);
        }
        
        public function startFade():void
        {
            line_UI.alpha = 1;
            fade.stop();
            fade.play(null, true);
        }
        
        public function stopFade():void
        {
            line_UI.alpha = 0;
            fade.stop();
        }
        
        public function clear():void
        {
            while (temp_movie.numChildren)
            {
                temp_movie.removeChildAt(0);
            }
            
            while (ui.numChildren)
            {
                ui.removeChildAt(0);
            }
            
            stopFade();
        }
    }
}

下载本示例的完整代码>>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011-09-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档