【AS3代码】小画板升级版(带重绘回放和清空功能)

生成按钮类

 package com.ui

{
     import flash.display.SimpleButton;
    
     import org.osmf.layout.AbsoluteLayoutFacet;

     public  class Button  extends SimpleButton
    {
         public  function Button(thistext: String):void
        {
             var arr:Array = init(thistext);
            
             super(arr[0],arr[1],arr[2],arr[2]);         // 调用父类的构造器函数
        }
         private  function init(thistext: String):Array
        {
             var atext:Text = new Text(thistext);
             var btext:Text = new Text(thistext);
             var ctext:Text = new Text(thistext);
            
             var a:Mysprite = new Mysprite(0xffff00);
             var b:Mysprite = new Mysprite(0x00ff00);
             var c:Mysprite = new Mysprite(0x0000ff);
            
            a.addChild(atext);
            b.addChild(btext);
            c.addChild(ctext);
            
             var abc:Array = [a, b, c];
             return abc;
        }
    }
}

 

 绘图类

 package com.ui

{
     import flash.display.Sprite;

     public  class Mysprite  extends Sprite
    {
         public  function Mysprite(col:uint):void
        {
            init(col);
        }
         private  function init(col:uint):void
        {
            this.graphics.beginFill(col);
            this.graphics.drawRect(0,0,100,30);
            this.graphics.endFill();
        }
    }
}

 

 文档类

package
{
     import com.ui.Button;
    
     import flash.display.Sprite;
     import flash.events.Event;
     import flash.events.MouseEvent;
    
     public  class Main  extends Sprite
    {        
         private  var isdown: Boolean =  false;
         private  var oldx: Number;
         private  var oldy: Number;
         private  var ceng:Sprite;     // 绘图层
        
         // ---------------------------------------------
        
         private  var dataarr:Array = new Array();     // 记录鼠标位置的数组
         private  var ci:uint = 0;                     // 记录绘图时向数组内添加的次数
         private  var    huici:uint;                         // 记录回放时播放到数组内的哪一步
         private  var a:Button;                         // 重绘按钮
         private  var b:Button;                         // 清除按钮
        
         public  function Main():void
        {
            init();
        }
        
         private  function init():void
        {
             // 创建2个按钮,并监听按钮点击事件
            a = new Button("重绘");
            a.x = 400;
            a.y = 300;
            b = new Button("清除");
            b.x = 400;
            b.y = 340;
            this.addChild(a);
            this.addChild(b);
            a.addEventListener(MouseEvent.CLICK,draw);
            b.addEventListener(MouseEvent.CLICK,clear);
            
             // 创建绘制图层
            ceng = new Sprite();
            this.addChild(ceng);
            
             // 监听鼠标的三种动作状态(按下,移动,抬起)
            this.stage.addEventListener(MouseEvent.MOUSE_DOWN, ondown);
            this.stage.addEventListener(MouseEvent.MOUSE_MOVE, onmove);
            this.stage.addEventListener(MouseEvent.MOUSE_UP, onup);            
        }
        
         private  function ondown(evt:MouseEvent):void
        {
            oldx = this.stage.mouseX;
            oldy = this.stage.mouseY;            
            
             if(a.hitTestPoint(this.stage.mouseX, this.stage.mouseY,  true) || b.hitTestPoint(this.stage.mouseX, this.stage.mouseY,  true))
            {
                isdown =  false;
            }
             else
            {
                isdown =  true;
                dataarr[ci] = new Array(oldx, oldy);         // 将按下去时的第一步坐标记录在回放数组里
            }
        }
        
         private  function onmove(evt:MouseEvent):void
        {
             if(isdown ==  true)
            {
                ci++;     // 次数递增
                ceng.graphics.lineStyle(2,0xff0000);
                ceng.graphics.moveTo(oldx, oldy);
                ceng.graphics.lineTo(stage.mouseX, stage.mouseY);
                
                oldx = stage.mouseX;
                oldy = stage.mouseY;
                dataarr[ci] = new Array(oldx, oldy);     // 将绘制的每一步坐标都记录在回放数组中
                
            }
        }
        
         private  function onup(evt:MouseEvent):void
        {
            isdown =  false;
        }
        
         // 重绘
         private  function draw(evt:MouseEvent):void
        {
            this.stage.addEventListener(Event.ENTER_FRAME,huizhi);
        }
        
         // 执行回放
         private  function huizhi(evt:Event):void
        {
             // 如果绘制的次数小于数组的长度,则可继续回放
             // 绘制时,起始值是0,假如绘制长度为100,所以绘制次数一定要小于总长度
             if(huici < (dataarr.length - 1))
            {
                ceng.graphics.lineStyle(2,0x000000);
                ceng.graphics.moveTo(dataarr[huici][0], dataarr[huici][1]);
                huici++;
                ceng.graphics.lineTo(dataarr[huici][0], dataarr[huici][1]);
            }
             else
            {
                 // 将绘制次数清零
                huici = 0;    
                
                 // 移除监听器
                this.stage.removeEventListener(Event.ENTER_FRAME, huizhi); 
            }
        }
        
         // 清除
         private  function clear(evt:MouseEvent):void
        {
            ceng.graphics.clear();
        }
    }

[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、付费专栏及课程。

余额充值