最近做的项目中有需要动态创建不规则图形 Mask,绘制的矢量图形 Mask 会占用大量 CPU 资源。以前以为用位图做 Mask 只能是矩形的,昨天发现把 Mask 和被 Mask 图形的 cacheAsBitmap 属性设置 true 就可以了,前提是遮罩和被遮罩的物件都是 Sprite 或者 MovieClip,不能直接用 Bitmap。下面是 AS3 的例子,AS2 同样支持。
import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.geom.Point; import flash.geom.Rectangle; var bmd:BitmapData = new BitmapData(200, 200, true, 0xFFFF0000); var bmdMask:BitmapData = new BitmapData(200, 200, true); var seed:int = int(Math.random() * int.MAX_VALUE); var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE; bmdMask.perlinNoise(100, 80, 12, seed, false, true, channels, false, null); var bitmap:Bitmap = new Bitmap(bmd); var bitmapMask:Bitmap = new Bitmap(bmdMask); addChild(bitmap); addChild(bitmapMask); var threshold:uint = 0×00800000; var color:uint = 0×00FFFFFF; var maskColor:uint = 0×00FF0000; bmdMask.threshold(bmdMask, bmdMask.rect, new Point(), ">", threshold, color, maskColor, true); var spriteMask = new Sprite(); spriteMask.addChild(bitmapMask); spriteMask.cacheAsBitmap = true; this.addChild(spriteMask); var display = new Sprite(); display.addChild(bitmap); display.cacheAsBitmap = true; addChild(display); display.mask = spriteMask;