做项目遇到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);
}
}
}