[ActionScript 3.0] AS3.0 涂鸦及擦除功能,撤销重做步骤记录实例

package
{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    import flash.net.dns.AAAARecord;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;

    /**
     * @author Frost.Yen
     * @email 871979853@qq.com
     * @build 2016-8-24 下午2:19:07
     */
    [SWF(width="800",height="600")]
    public class DrawToUndo extends Sprite
    {
        private var _undoBtn:Sprite;
        private var _redoBtn:Sprite;
        private var _eraseBtn:Sprite;
        private var _drawBtn:Sprite;
        private var _canvas:Sprite;
        private var _list:Sprite;
        private var _line:Shape;
        private var _thickness:Number=5;
        private var _dataArr:Array=[];
        private var _blendMode:String = BlendMode.NORMAL;
        private var _stepID:int=-1;
        public function DrawToUndo()
        {
            if(stage) init();
            else addEventListener(Event.ADDED_TO_STAGE,init);
        }
        /**
         * 初始化
         */
        private function init(e:Event=null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            _list = new Sprite();
            _canvas = new Sprite();
            _canvas.graphics.beginFill(0,0);
            _canvas.graphics.drawRect(0,0,700,600);
            _canvas.graphics.endFill();
            _undoBtn = creatButton(75,25,0xeeeeee,"撤销") as Sprite;
            _redoBtn = creatButton(75,25,0xeeeeee,"重做") as Sprite;
            _eraseBtn = creatButton(75,25,0xeeeeee,"擦除") as Sprite;
            _drawBtn = creatButton(75,25,0xeeeeee,"涂鸦") as Sprite;
            _line = new Shape();
            
            addToDisplay(_list,this);
            addToDisplay(_canvas,this);
            addToDisplay(_line,this,0,0,1,true);
            addToDisplay(_undoBtn,this,710,10);
            addToDisplay(_redoBtn,this,710,45);
            addToDisplay(_eraseBtn,this,710,80);
            addToDisplay(_drawBtn,this,710,115);
            
            initEventListener();
        }
        private function initEventListener():void
        {
            _undoBtn.addEventListener(MouseEvent.CLICK,onUndo);
            _redoBtn.addEventListener(MouseEvent.CLICK,onRedo);
            _eraseBtn.addEventListener(MouseEvent.CLICK,onErase);
            _drawBtn.addEventListener(MouseEvent.CLICK,onDraw);
            _canvas.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
        }
        private function onDown(e:MouseEvent):void
        {
            stage.addEventListener(MouseEvent.MOUSE_UP,onUp);
            stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
            _line.graphics.lineStyle(_thickness,0xff00ff);
            _line.graphics.moveTo(_canvas.mouseX,_canvas.mouseY);
            _blendMode == BlendMode.ERASE?_line.visible = false:_line.visible = true;
            if(_blendMode == BlendMode.ERASE){
                var matrix:Matrix = new Matrix();
                matrix.translate(-_dataArr[_stepID].rect.x,-_dataArr[_stepID].rect.y);
            }
            function onMove(e:MouseEvent):void
            {
                _line.graphics.lineTo(_canvas.mouseX,_canvas.mouseY);    
                if(_blendMode == BlendMode.ERASE){
                    (_list.getChildAt(0) as Bitmap).bitmapData.draw(_line,matrix,null,_blendMode);
                }
            }
            function onUp(e:MouseEvent):void
            {
                if(_blendMode == BlendMode.ERASE){
                    //记录擦除步骤
                    var data:Object = {"rect":_dataArr[_stepID].rect,"bmpd":(_list.getChildAt(0) as Bitmap).bitmapData.clone()};
                    _dataArr.push(data);
                    _stepID++;
                    _line.graphics.clear();
                    removeBitmap();
                    addBitmap(_stepID);
                }else{
                    while(_stepID<_dataArr.length-1){
                        _dataArr.pop();
                    }
                    //记录涂鸦步骤
                    var rect:Rectangle  = _line.getBounds(_line);trace(rect);
                    var bmpd:BitmapData = new BitmapData(rect.width,rect.height,true,0);
                    var bmp:Bitmap = new Bitmap();
                    var matrix:Matrix = new Matrix();
                    matrix.translate(-rect.x,-rect.y);
                    bmpd.draw(_line,matrix,null,_blendMode,null,true);
                    bmp.bitmapData = bmpd;
                    addToDisplay(bmp,_list,rect.x,rect.y);
                    getDrawData();
                }
                
                stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);
                stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMove);
            }
        }
        /**
         * 将步骤数据记录到数组
         */
        private function getDrawData():void
        {
            var rect:Rectangle = _list.getBounds(_list);
            var bmpd:BitmapData = new BitmapData(rect.width,rect.height,true,0);
            var bmp:Bitmap = new Bitmap(bmpd);
            var matrix:Matrix = new Matrix();
            matrix.translate(-rect.x,-rect.y);
            bmpd.draw(_list,matrix,null,_blendMode,null,true);
            var data:Object = {"rect":rect,"bmpd":bmpd.clone()};
            _dataArr.push(data);
            _stepID++;
            
            _line.graphics.clear();
            removeBitmap();
            addToDisplay(bmp,_list,rect.x,rect.y);
        }
        /**
         * 撤销
         */
        private function onUndo(e:MouseEvent):void
        {
            if(_stepID>=0&&_stepID<=_dataArr.length-1){
                removeBitmap();
                _stepID--;
                if(_stepID < 0){
                    _stepID=-1;
                }else{
                    addBitmap(_stepID);
                }
                
            }
            trace("撤销step:",_stepID);
        }
        /**
         * 重做
         */
        private function onRedo(e:MouseEvent):void
        {
            if(_stepID<=_dataArr.length-1){
                removeBitmap();
                _stepID++;
                if(_stepID >_dataArr.length-1){
                    _stepID = _dataArr.length-1;
                }
                addBitmap(_stepID);
            }
            trace("重做step:",_stepID);
        }
        /**
         * 呈现步骤图像
         */
        private function addBitmap(step:int):void
        {
            var bmp:Bitmap = new Bitmap(_dataArr[_stepID].bmpd.clone());
            addToDisplay(bmp,_list, _dataArr[_stepID].rect.x,_dataArr[_stepID].rect.y);
        }
        /**
         * 移除列表内容
         */
        private function removeBitmap():void
        {
            while(_list.numChildren>0){
                if(_list.getChildAt(0) is Bitmap){
                    (_list.getChildAt(0) as Bitmap).bitmapData.dispose();
                    _list.removeChildAt(0);
                }
            }
        }
        private function onErase(e:MouseEvent):void
        {
            _blendMode = BlendMode.ERASE;
            _thickness = 10;//擦除的粗细
        }
        private function onDraw(e:MouseEvent):void
        {
            _blendMode = BlendMode.NORMAL;
            _thickness = 5;//涂鸦的粗细
        }
        private function creatButton(w:Number,h:Number,color:uint,text:String=""):Sprite
        {
            var button:Sprite = new Sprite();
            button.graphics.beginFill(color,1);
            button.graphics.drawRect(0,0,w,h);
            button.graphics.endFill();
            var t:TextField = new TextField();
            t.autoSize = TextFieldAutoSize.LEFT;
            t.selectable = false;
            t.text = text;
            button.addChild(t);
            t.x = (button.width-t.width)*.5;
            t.y = (button.height-t.height)*.5;
            return button;
        }
        private function addToDisplay(target:DisplayObject,parent:DisplayObjectContainer,x:Number=0,y:Number=0,alpha:Number=1,visible:Boolean = true,scaleX:Number=1,scaleY:Number=1):void
        {
            parent.addChild(target);
            target.x = x;
            target.y = y;
            target.alpha = alpha;
            target.visible = visible;
            target.scaleX = scaleX;
            target.scaleY = scaleY;
        }
    }
}

 

转载于:https://www.cnblogs.com/frost-yen/p/5807378.html

[FLASH/AS1/2]简易涂鸦板(带本地保存功能与撤消上一步功能) 作者:古树悬叶 日期:2010-01-07 二类涂鸦板:一种是主流的通过保存鼠标轨迹的方式来保存涂鸦数据,既使用矢量的方式来保存,样例如闪吧的涂鸦程序;另一种是通过保存 BitmapData 颜色值的方式来保存,样例还没有找到比较像样的样例。 在《内置方法Array.shift 与自定义循环++的执行效率比较》一文中,我已经对 shift 方法与自定义的 ++ 方式分别作了比较。虽然自定义 ++ 的方式比shift方法要快,但事实它们二者的效率都很低。由于 SharedObject 类是无法直接保存 BitmapData 对象的,所以只能将 BitmapData 的所有位图像素的每一个像素取 ARGB 值后保存。一张位图按500像素 x 500像素算,自定义 ++ 需要3秒多,而 shit 方法脚本超时。所以通过 BitmapData 的颜色方式来保存只能保存较小的位图。所以通过鼠标轨迹的方式保存涂鸦成了主流。 此涂鸦板涂鸦之后会自动将涂鸦保存在本地,并且可以撤消上一步操作。涂鸦画线功能我是直接从FLASH帮助文件中考贝出来的,我在涂鸦功能的基础上添加了本地保存和撤消的功能 。(代码可以扩展成自定义线条粗细,自定义线条颜色,透明度等等。还可以添加新的数据用来记录被撤消的步聚,这样不旦可以撤消还有了重做功能。甚至还可以在 tempArray.push 添加新的数组,同时保存不同线条粗细、颜色、透明度的涂鸦,做成一个类似画板的程序。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值