Как рисовать карандашом с помощью BitmapData? - PullRequest
0 голосов
/ 06 января 2012

Сейчас у меня есть только этот код, но я не использую 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;
}

Ответы [ 2 ]

1 голос
/ 06 января 2012

Вот пример кода на основе вашего кода.Вы попробуете это, просто сделав его базовым классом фильма.

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);

    }           

}

}

0 голосов
/ 06 января 2012

Хорошо, ваш вопрос не очень понятен, я полагаю, что вы хотите скопировать свой контент в растровое изображение.Если это то, чего вы хотите достичь, просто создайте новый bitmapData, нарисуйте в нем свой спрайт и используйте его как источник растрового изображения.Например, когда вы закончите рисовать в своем penSprite, вы можете скопировать его в растровое изображение следующим образом:

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

Надеюсь, это то, что вы ищете.

РЕДАКТИРОВАТЬ: Iвидите, что вы просто добавляете комментарий к своему вопросу, говоря, что вы хотите нарисовать «используя bitmapData.draw».Итак, я думаю, что вы неправильно понимаете использование этого метода.Если вы посмотрите документацию:

"Рисует исходный экранный объект на растровом изображении, используя векторный рендеринг среды выполнения Flash."

Таким образом, вы в основном используете его для рисования другого экранного объекта вBitmapData.

...