我正在开发一个类似于MS Paint的应用程序。我正在构建一个Flash Paint应用程序。基本结构是这样的。 我有两层,即topLayer_mc和bottomLayer_mc。实际矢量绘图绘制在工具的顶层和onmouseUp上,顶层上的矢量图形的位图副本被采用并作为位图添加到底层。随后清除顶层。它适用于铅笔工具。 现在我需要创建一个橡皮擦工具。这是事情变得棘手的地方。在应用程序中有一个选项将图像保存为png,因此alpha保留最高。所以使用矢量绘制画笔和使用位图绘制方法的传统方法是行不通的。当然,在视觉水平上,如果使用矢量绘制的画笔具有与背景相同的颜色,它将起作用。
我需要的是激动地擦除像素。
橡皮擦是矩形的。
我要使用的技术是使用BitmapData类的copyChannel方法。指定一个 通道(比如绿色通道)十六进制值为00并将其作为源。然后制作目标频道ALPHA。
我没有使用动画片段就可以使用它,如下所示。
stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDowny)
var bmd:BitmapData = new BitmapData(100, 80, true, 0xFFFF0000);
var bm:Bitmap = new Bitmap(bmd);
this.addChild(bm);
function onMouseDowny(evt:MouseEvent):void
{
var rect:Rectangle = new Rectangle(0, 0, 20, 20);
var pt:Point = new Point(mouseX, mouseY);
bmd.copyChannel(bmd, rect, pt, BitmapDataChannel.GREEN , BitmapDataChannel.ALPHA);
}
只需点击红色sqaure中的多个点,这些点的alpha就为零。
在这里,鼠标点的alpha数据为零。它使用复制通道。 swf在这里显示。
swf的链接 -
http://bobbythecoder.blogspot.com/2011/05/copy-channel-doubt-woking.html
但是当我尝试在应用程序中使用它时,它只是不起作用。当然我需要的是一种通过鼠标移动来进行大量擦除的方法。但是首先我需要用所需的矩形尺寸清除我的特定点。
SWF在这里给出:
http://bobbythecoder.blogspot.com/2011/05/copy-channel-doubt-not-working.html
单击铅笔,然后在画布上使用铅笔绘制。
这里给出了fla。 http://www.easy-share.com/1915107181/Eraser复制频道.fla
我正在使用的代码就是这个。
var gfx:Graphics;
gfx=topLayer_mc.draw_mc.graphics;
var eraserBitmapData:BitmapData;
var bm:Bitmap;
pollPencil();
pollEraser();
function pollPencil():void {
pencil_btn.addEventListener(MouseEvent.MOUSE_DOWN,onPencilDraw);
}
function onPencilDraw(evt:MouseEvent):void {
topLayer_mc.addEventListener(MouseEvent.MOUSE_DOWN,onMouseActivity);
}
function onMouseActivity(evt:MouseEvent):void {
switch (String(evt.type)) {
case "mouseDown" :
var initX:Number=topLayer_mc.mouseX;
var initY:Number=topLayer_mc.mouseY;
gfx.lineStyle(1,0,1);
gfx.moveTo(initX,initY);
topLayer_mc.addEventListener(MouseEvent.MOUSE_MOVE, onMouseActivity);
break;
case "mouseUp" :
topLayer_mc.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseActivity);
var mcBMPD:BitmapData=new BitmapData(topLayer_mc.width,topLayer_mc.height,true,0x000000);
var mcBMP:Bitmap=new Bitmap(mcBMPD);
mcBMPD.draw(topLayer_mc.draw_mc);
bottomLayer_mc.addChild(mcBMP);
gfx.clear();
break;
case "mouseMove" :
var finalX:Number=topLayer_mc.mouseX;
var finalY:Number=topLayer_mc.mouseY;
gfx.lineTo(finalX,finalY);
topLayer_mc.addEventListener(MouseEvent.MOUSE_UP, onMouseActivity);
}
}
function pollEraser()
{
eraserBitmapData = new BitmapData(bottomLayer_mc.width,bottomLayer_mc.height,true,0x00000000);
eraserBitmapData.draw(bottomLayer_mc);
var rect:Rectangle = new Rectangle(0, 0, 50, 50);
var pt:Point = new Point(10,10);
eraserBitmapData.copyChannel(eraserBitmapData, rect, pt, BitmapDataChannel.GREEN, BitmapDataChannel.ALPHA);
bm =new Bitmap(eraserBitmapData);
bottomLayer_mc.addChild(bm);
}
答案 0 :(得分:0)
我真的不知道你在那里做什么,但我做了类似绘图板的擦除功能。在我的董事会中,擦除是这样实现的:
由于您的橡皮擦是矩形的,您需要像使用刷子一样对待它 - 用鼠标移动扩展矩形。唯一不同的结果应该是不可见的,并在擦除模式下绘制。