[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;
}
}
}
[ActionScript 3.0] AS3.0 涂鸦及擦除功能,撤销重做步骤记录实例的更多相关文章
- [ActionScript 3.0] AS3.0和AS2.0的相互通信
AS3和AS2之间的通信,最好的方式可能就是LocalConnection了. AS2向AS3发送数据,即AS2调用AS3的函数: as2.0代码(按钮上写的发送信息代码): on (release) ...
- [ActionScript 3.0] AS3.0 让一个视频无缝循环播放的一个偏方
一个视频要循环播放,通常的办法都是播放完后再重新播放,但是不可避免的播放结束和重新开始播放这个时间点上会有停顿,如何解决这个问题,说个偏方吧! package com.views { import f ...
- [ActionScript 3.0] AS3.0 下雨及涟漪效果
帧代码: stage.frameRate = 80; function init(x1:Number,y1:Number) { var mc:MovieClip=new MovieClip(); ad ...
- [ActionScript] AS3 涂鸦的擦除和撤销功能
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMo ...
- [ActionScript 3.0] AS3.0 本机鼠标指针
Flash Player 10.2添加了内置的本机鼠标指针(native mouse cursor)支持,虽然在之前的版本里我们可以侦听MouseEvent事件来模拟鼠标指针,但是在有了原生的本机鼠标 ...
- [ActionScript 3.0] AS3.0 动态加载显示内容
可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...
- [ActionScript 3.0] AS3.0 简单封装Socket的通信
Socket服务器 package com.controls.socket { import com.models.events.AppEvent; import com.models.events. ...
- [ActionScript 3.0] AS3.0 Socket通信实例
以下类是充当Socket服务器的例子 package { import flash.display.Sprite; import flash.events.Event; import flash.ev ...
- [ActionScript 3.0] AS3.0 对象在矩形范围随机运动
package com.views { import flash.display.Bitmap; import flash.display.MovieClip; import flash.displa ...
随机推荐
- WCF初探-20:WCF错误协定
WCF错误协定概述 在所有托管应用程序中,处理错误由 Exception 对象表示. 在基于 SOAP 的应用程序(如 WCF 应用程序)中,服务方法使用 SOAP 错误消息来传递处理错误信息. SO ...
- hibernate FetchType理解
JPA定义实体之间的关系有如下几种: @OneToOne @ManyToOne @OneToMany @ManyToMany 在定义它们的时候可以通过fetch属性指定加载方式,有两个值: Fetch ...
- 前端获取url参数
function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)( ...
- application loader上传报90158错误
ERROR ITMS-90158:"The following URL schemes found in your app are not in the current format:[XX ...
- 监听器初始化Job、JobTracker相应TaskTracker心跳、调度器分配task源码级分析
JobTracker和TaskTracker分别启动之后(JobTracker启动流程源码级分析,TaskTracker启动过程源码级分析),taskTracker会通过心跳与JobTracker通信 ...
- Python的平凡之路(10)
异步IO 数据库 队列 缓存 1.Gevent协程 定义:用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下 ...
- Python::OS 模块 -- 文件和目录操作
os模块的简介参看 Python::OS 模块 -- 简介 os模块的进程管理 Python::OS 模块 -- 进程管理 os模块的进程参数 Python::OS 模块 -- 进程参数 os模块中包 ...
- python数据结构与算法——二叉树结构与遍历方法
先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历 采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # ...
- jquery插件文件上传
文件上传有很多jQuery插件,一般我最为常用的就是uploadify.js和ajaxfileupload.js,二者都是以file标签为依托,前者需要在页面初始化时就渲染插件,比较适合单纯的文件上传 ...
- 将JZ2440的调试串口换成com2
众所周知JZ2440 V3很小巧,精致.今天单就JZ2440的串口来讨论一些问题.我们在用串口进行调试的时候,需要用JZ2440自带的一根USB线连接电脑USB口和开发板的USB-com1口.先来看一 ...