[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 ...
随机推荐
- 从一个ISP移至另一个ISP而不改变IP的方案
某客户从一个ISP_A移到了另一个ISP_B.但是,其WEB服务器由于之前对外公布的是IP地址,且无DNS,因此,要求该服务器搬至ISP_B后,用户依然可以访问原来的IP地址,求方案. 假设:ISP_ ...
- 动态监控驱动、dll、exe加载
/* windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通过 */ #include <ntddk.h> #include " ...
- 如何重新安装DEDECMS织梦系统
重装的方法: 1.找到安装目录\install\index.php.bak文件,改名为index.php: 2.删除安装目录\install\install_lock文件:
- 记录一些容易忘记的属性 -- UINavigationController
//设置导航栏的风格 self.navigationController.navigationBar.barStyle = UIBarStyleDefault; //设置导航栏是否透明 N ...
- 2014年4月份第4周51Aspx源码发布详情
精灵豆会员管理系统源码 2014-4-21 [VS2010]功能介绍:精灵豆会员管理系统业务管理平台采用微软选进的C#语言开发,采用大型数据库,具有比较高的执行效率和高安全性.系统分为消费管理,会员 ...
- Android Studio实现页面跳转(新页面或者网站)
一,跳转到另一个页面 百度了好久,好像好多种方法,从中挑选了一中比较方便的一中方法 利用Intent类进行实现 1,首先在firstActivity中添加相应的跳转命令代码 例如一下示例代码 if ( ...
- 帐户当前被锁定,所以用户 sa 登录失败。系统管理员无法将该帐户解锁 解决方法
ALTER LOGIN sa ENABLE ; GO ALTER LOGIN sa WITH PASSWORD = 'password' unlock, check_policy = off, che ...
- H.264简介
H.264/MPEG-4 AVC (H.264) 是1995年自MPEG-2视频压缩标准发布以后最新的, 最有前途的视频压缩标准. H.264是由ITU-U和ISO/IEC联合开发组共同开发的最新国际 ...
- Windows 2012 装 Remote Desktop Organizer 无法连接到其他远程服务器
一句话,版本太低 换Remote Desktop Organizer 1.4.5版本就ok 了
- addslashes() 函数和stripslashes()函数
addslashes() 函数 定义和用法 addslashes() 函数在指定的预定义字符前添加反斜杠. 这些预定义字符是: 单引号 (') 双引号 (") 反斜杠 (\) NULL 语法 ...