【问题标题】:How can I draw with a pencil using BitmapData?如何使用 BitmapData 用铅笔绘图?
【发布时间】:2012-01-06 23:09:38
【问题描述】:

现在我只有这个代码,但我没有使用BitmapData.draw()。如何使用BitmapData.draw() 编写代码?

penSprite.graphics.lineStyle(3,045666);

addChild(penSprite);

addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
addEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
addEventListener(MouseEvent.MOUSE_UP,   mouseUp);

penSprite = new Sprite();                  //var penSprite:Sprite = new Sprite();
mouseDownFlag = new Boolean();            //var mouseDownFlag:Boolean = false;

private function mouseDown(e:MouseEvent):void
{
    penSprite.graphics.moveTo(e.localX, e.localY);
    mouseDownFlag = true;
}

private function mouseMove(e:MouseEvent):void
{
    if (mouseDownFlag) penSprite.graphics.lineTo(e.localX, e.localY);
}

private function mouseUp(e:MouseEvent):void
{
    mouseDownFlag = false;
}

【问题讨论】:

  • 你到底想完成什么?
  • 我想用鼠标或笔使用 bitmapData.Draw() 绘制,在他的代码中我没有使用 bitmapData.Draw()。

标签: actionscript-3 bitmapdata


【解决方案1】:

这是基于您的代码的代码示例。您只需将其设为电影的基类即可尝试。

package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;

/**
 * Drawing app
 */
public class DrawingApp extends MovieClip {

    /** Drawing sprite */
    protected var penSprite     : Sprite = new Sprite();

    /** Bitmap where drawing will be saved */
    protected var canvasBitmap  : Bitmap;

    /**
     * Class constructor
     */
    public function DrawingApp () {

        // create bitmap that hold a bitmap data, where your drawing will displayed
        this.canvasBitmap = new Bitmap( new BitmapData( this.stage.stageWidth, this.stage.stageHeight ), "auto", true );

        // add children. Canvas must be below sprite
        this.addChild( canvasBitmap );
        this.addChild(penSprite);

        this.penSprite.graphics.lineStyle(3, 0x000000 );

        // listen to stage, not to the root or you won't get mouse down events root sprite is empty.
        this.stage.addEventListener(MouseEvent.MOUSE_DOWN, this.mouseDown);

    }

    /**
     * Start drawing 
     */
    private function mouseDown(e:MouseEvent):void {

        this.penSprite.graphics.moveTo(e.localX, e.localY);

        // add movement listeners here instead of using flag
        this.stage.addEventListener(MouseEvent.MOUSE_MOVE, this.mouseMove);
        this.stage.addEventListener(MouseEvent.MOUSE_UP,   this.mouseUp);

    }

    /**
     * Draw line on sprite
     */
    private function mouseMove(e:MouseEvent):void {
        penSprite.graphics.lineTo( e.localX, e.localY );
    }

    /**
     * Draw sprite graphics to canvas and end drawing by cleaning up sprite graphics and unregistering movement listeners
     */
    private function mouseUp(e:MouseEvent):void {

        // draw sprite graphics to bitmap data (last parameter makes drawing smooth)
        canvasBitmap.bitmapData.draw( penSprite, null, null, null, null, true );

        // remove listeners 
        this.stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMove);
        this.stage.removeEventListener(MouseEvent.MOUSE_UP,   mouseUp);

    }           

}

}

【讨论】:

  • 好的,我现在已经尝试过了,我得到了这个错误:TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 DrawingApp()[/Users/VVT/Documents/Adobe Flash Builder 4.6/SuperDraw/src/DrawingApp.as:25] 在 SuperDraw()[/Users/VVT/Documents/Adobe Flash Builder 4.6/SuperDraw/src/SuperDraw。如:59]
  • 好的,现在它的工作......你的代码工作完美,谢谢......问题解决了
【解决方案2】:

好的,你的问题不是很清楚,我想你想把你的内容复制到一个位图中。 如果这是您想要完成的,只需创建一个新的 bitmapData,在其中绘制您的精灵并将其用作位图的来源。 例如,当您在 penSprite 中完成绘制后,您可以将其复制到 Bitmap 中,如下所示:

 var bData:BitmapData = new BitmapData(penSprite.width, penSprite.height,true,0xFFFFFFFF);
 bData.draw(penSprite);
 var image:Bitmap=new Bitmap(bData);
 addChild(image);

希望这就是你要找的。​​p>

编辑: 我看到你只是在你的问题中添加了一条评论,说你想绘制“使用 bitmapData.draw”。所以,我认为您误解了该方法的使用。如果您查看文档:

“使用 Flash 运行时矢量渲染器将源显示对象绘制到位图图像上。”

所以你基本上是用它在 bitmapData 中绘制另一个显示对象。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多