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

[ActionScript 3.0] AS3.0 涂鸦及擦除功能,撤销重做步骤记录实例的更多相关文章

  1. [ActionScript 3.0] AS3.0和AS2.0的相互通信

    AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) ...

  2. [ActionScript 3.0] AS3.0 让一个视频无缝循环播放的一个偏方

    一个视频要循环播放,通常的办法都是播放完后再重新播放,但是不可避免的播放结束和重新开始播放这个时间点上会有停顿,如何解决这个问题,说个偏方吧! package com.views { import f ...

  3. [ActionScript 3.0] AS3.0 下雨及涟漪效果

    帧代码: stage.frameRate = 80; function init(x1:Number,y1:Number) { var mc:MovieClip=new MovieClip(); ad ...

  4. [ActionScript] AS3 涂鸦的擦除和撤销功能

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMo ...

  5. [ActionScript 3.0] AS3.0 本机鼠标指针

    Flash Player 10.2添加了内置的本机鼠标指针(native mouse cursor)支持,虽然在之前的版本里我们可以侦听MouseEvent事件来模拟鼠标指针,但是在有了原生的本机鼠标 ...

  6. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

  7. [ActionScript 3.0] AS3.0 简单封装Socket的通信

    Socket服务器 package com.controls.socket { import com.models.events.AppEvent; import com.models.events. ...

  8. [ActionScript 3.0] AS3.0 Socket通信实例

    以下类是充当Socket服务器的例子 package { import flash.display.Sprite; import flash.events.Event; import flash.ev ...

  9. [ActionScript 3.0] AS3.0 对象在矩形范围随机运动

    package com.views { import flash.display.Bitmap; import flash.display.MovieClip; import flash.displa ...

随机推荐

  1. C#微信开发-微信JS-SDK(1)之通过config接口注入权限验证配置

    官方文档是微信JS-SDK的使用步骤http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#JSSDK.E4.BD.B ...

  2. 【转】request和response的页面跳转传参

    下面是一位园友的文章: jsp或Servlet都会用到页面跳转,可以用 request.getRequestDispatcher("p3.jsp").forward(request ...

  3. chromium 一些设置 --插件安装

    一.安装flash插件 打开网页 http://get.adobe.com/cn/flashplayer/otherversions/ 选择如图 所示  fp 18 for Opera and Chr ...

  4. Python开发入门与实战10-事务

    1. 事务 本章我们将通过一个例子来简要的说明“事务”,这个开发实战里经常遇到的名词.事务是如何体现在一个具体的业务和系统的实现里. 事务是通过将一组相关操作组合为一个,要么全部成功要么全部失败的单元 ...

  5. WCF 断点不会命中

    VS的调试模式改为Debug 工具—选项—调试—常规中的‘要求源文件和原始版本完全匹配’的勾去掉

  6. android 面试总结,后续注意学习

    1.数据结构和算法 一般情况下,工作中是用不到的,但是就是问,每个公司都问,而且有的公司还问的特别深,还让你手写代码.我觉得这个确实有点恶心,我个人也是很讨厌算法的,但是真是没办法,人家就问,你说怎么 ...

  7. 安装java和jmeter

    win7 64位 安装java 1.下载java开发工具包JDK,在硬盘创建java文件夹,在里面创建jdk1.8.0_101和jre1.8.0_101 2.安装jdk,第一个路径装在jdk1.8.0 ...

  8. js从后台无法取值问题

    前台代码 <script type="text/javascript"> $(function () { var chart; $(document).ready(fu ...

  9. BZOJ 3809 莫队+(分块|BIT)

    #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> ...

  10. Block存储区域

    Block存储区域 首先,需要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字 ...