玩过截图的人都知道截图是怎样一回事,通过截取图片一个地方就能够获取到图片某一个片段。这一个部分在flash 里面可以利用位图的复制像素来实现。通过copyPixels 或者draw 能够获取像素。

现在我们讨论一个话题:在flash里面怎样实现这种截图? 带着这个问题,尝试制作一个demo出来。功能就是获取位图。

所需要的材料:第一就是flash绘图API ,第二就是位图像素操作。利用这两个我们就能够实现出这种交互效果。

设计的图案:

制作思路:首先知道怎样绘制一个矩形,可以上网搜索一下,或者查询一些flash绘图API 是如何操作的。借助绘制这股矩形,我们就能截取到我们所需要的片段。

接下来,为程序写一个基类:Item.as

定义一些常用的方法和属性。

例如绘制矩形。获取位图,定义线条的样式等,判断矩形是否有效

这些方法都是定义在这个基础类当中。

package org.summerTree { //选择类基本设置 import flash.display.Sprite; import flash.geom.Rectangle; import flash.events.EventDispatcher; import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Point; public class Item extends EventDispatcher { public var LineColor:int=0x0000ff;//线条颜色 public var FillColor:int=0x0000ff;//填充的颜色 public var FillAlpha:Number=0.1; public function Item() { } //绘制矩形的基本方法 protected function DrawRect(shape:Sprite,rect:Rectangle):void { shape.graphics.clear(); shape.graphics.lineStyle(1,LineColor,1); shape.graphics.beginFill(FillColor,FillAlpha); shape.graphics.drawRect(rect.x,rect.y,rect.width,rect.height); shape.graphics.endFill(); } //判断rect是否有效 public function checkRect(rect:Rectangle):Boolean { return rect != null?true:false; } //定义样式 public function setStyle(lcolor:int,fcolor:int,aplha:Number):void { this.LineColor=lcolor; this.FillColor=fcolor; this.FillAlpha=aplha; } //获取位图 public function getImage(source:Bitmap,rect:Rectangle):Bitmap { var bitmapdata:BitmapData = source.bitmapData; var Width:Number=Math.abs(rect.width); var Height:Number=Math.abs(rect.height); var temp:Rectangle; var newImage:BitmapData; if (rect.width>0 && rect.height>0) { newImage=new BitmapData(Width,Height, false);// newImage.copyPixels(bitmapdata,rect,new Point(0,0)); } else if (rect.width<0 && rect.height>0) { newImage=new BitmapData(Width,Height, false);// temp=new Rectangle(rect.x-Width,rect.y,Width,Height); newImage.copyPixels(bitmapdata,temp,new Point(0,0)); } else if (rect.width<0 && rect.height<0) { newImage=new BitmapData(Width,Height, false);// temp=new Rectangle(rect.x-Width,rect.y-Height,Width,Height); newImage.copyPixels(bitmapdata,temp,new Point(0,0)); } else if (rect.width>0 && rect.height<0) { newImage=new BitmapData(Width,Height, false);// temp=new Rectangle(rect.x,rect.y-Height,Width,Height); newImage.copyPixels(bitmapdata,temp,new Point(0,0)); } return new Bitmap(newImage); } } }

基本接口:获取矩形,裁剪位图,取消操作,命令监听

package org.summerTree { import flash.geom.Rectangle; import flash.display.Bitmap; public interface ISelector { function getRect2D():Rectangle; function CutIamge(source:Bitmap):Bitmap; function Cancel():void; function addActionListener():void; } }

通过继承这个类实现一个接口,创建如何去选取位图

这个过程当中需要使用绘图API,首先通过鼠标交互绘制一个矩形,这个矩形通过drawRect来进行绘制。

当中对一些矩形进行拖放,和矩形拉伸 则需要通过重新绘制来获取到。这里主要涉及到技术就是绘图API 和鼠标交互。当中没有很难的技术点。关键的地方 使用Rectangle 的使用上,从这个案例当中你会发现这个类会帮助你实现 截图功能。

public class Selector extends Item implements ISelector 这样实现接口方式书写。

我们需要知道怎样通过鼠标交互拖放的时候影响矩形的大小,拉伸和缩放的时候,其实Rectangle 矩形会发生改变,通过这个对象能够获取他的坐标,宽度和高度,从而重绘制矩形带来一定帮助。

思路就是这样。

package org.summerTree { //version 1.0 裁剪类,对位图进行裁剪 //写于2010 年 1月30日 import flash.display.Sprite; import flash.display.DisplayObjectContainer; import flash.events.*; import flash.geom.*; import flash.display.Bitmap; import flash.display.BitmapData; import flash.utils.ByteArray; import flash.display.Stage; import org.summerTree.button.SButton;//缩放按钮 import org.summerTree.button.ButtonBar;//确定和取消按钮 import org.summerTree.button.ButtonPath; import org.summerTree.Item; import org.summerTree.event.SelectEvent; import org.summerTree.ISelector; public class Selector extends Item implements ISelector { private var point:Point;//记录一个定点 private var target:DisplayObjectContainer;//裁剪的对象 private var rect:Rectangle; private var pen:Sprite=new Sprite(); private var button:SButton;//选择类的按钮 private var buttonOk:ButtonBar=new ButtonBar();//确定按钮 private var buttonCannel:ButtonBar=buttonOk.clone();//取消按钮 private var isMove:Boolean=false; private var mystage:Stage; public function Selector(target:DisplayObjectContainer,stage:Stage) { this.target=target;//选择的对象 this.target.addChild(pen); this.mystage=stage; } public function addActionListener():void { target.addEventListener(MouseEvent.MOUSE_DOWN,DrawingHandler); } private function DrawingHandler(event:MouseEvent):void { switch (event.type) { case MouseEvent.MOUSE_DOWN : point=new Point(this.target.mouseX,this.target.mouseY); target.addEventListener(MouseEvent.MOUSE_MOVE,DrawingHandler); mystage.addEventListener(MouseEvent.MOUSE_UP,DrawingHandler); break; case MouseEvent.MOUSE_MOVE : rect=new Rectangle(point.x,point.y,target.mouseX - point.x,target.mouseY - point.y); trace(rect); DrawRect(pen,rect); event.updateAfterEvent(); break; case MouseEvent.MOUSE_UP : trace("执行这里"+target.parent.parent); target.removeEventListener(MouseEvent.MOUSE_MOVE,DrawingHandler); mystage.removeEventListener(MouseEvent.MOUSE_UP,DrawingHandler); target.removeEventListener(MouseEvent.MOUSE_DOWN,DrawingHandler); creatButton(); startdragRect();//拖动巨型 break; default : //isMove=false; break; } } //创建按钮,并对按钮进行监听 private function creatButton():void { if (checkRect(rect)) { button=new SButton(); buttonOk.addButton(ButtonPath.Btn_ok); buttonCannel.addButton(ButtonPath.Btn_cannel); this.target.addChild(button); this.target.addChild(buttonOk); this.target.addChild(buttonCannel); button.addEventListener(MouseEvent.MOUSE_DOWN,buttonDownHandler); buttonOk.addEventListener(MouseEvent.MOUSE_DOWN,buttonDownHandler); buttonCannel.addEventListener(MouseEvent.MOUSE_DOWN,buttonDownHandler); button.name="dragbutton"; buttonOk.name="buttonOk"; buttonCannel.name="buttonCannel"; button.buttonMode=true; buttonOk.buttonMode=true; buttonCannel.buttonMode=true; button.Move(rect.right-button.width,rect.bottom-button.height); buttonOk.Move(rect.x,rect.bottom); buttonCannel.Move(rect.x+60,rect.bottom); } else { addActionListener(); } } //拖动图形 private function startdragRect():void { if (checkRect(rect)) { pen.addEventListener(MouseEvent.MOUSE_DOWN,startDragHandler);//拖动监听 pen.buttonMode=true; } else { addActionListener(); } } //用于缩放矩形 private function startDragHandler(event:MouseEvent):void { point=new Point(this.target.mouseX-rect.x,this.target.mouseY-rect.y); target.addEventListener(MouseEvent.MOUSE_MOVE,DragingHandler); target.addEventListener(MouseEvent.MOUSE_UP,EndDragHandler); } private function DragingHandler(event:MouseEvent):void { if (point!=null) { rect=new Rectangle(this.target.mouseX - point.x,this.target.mouseY - point.y,rect.width,rect.height); DrawRect(pen,rect); button.Move(rect.right-button.width,rect.bottom-button.height); buttonOk.Move(rect.x,rect.bottom); buttonCannel.Move(rect.x+60,rect.bottom); event.updateAfterEvent(); } } private function EndDragHandler(event:MouseEvent):void { point=null; target.removeEventListener(MouseEvent.MOUSE_MOVE,this.DragingHandler); target.removeEventListener(MouseEvent.MOUSE_UP,this.EndDragHandler); } private function buttonDownHandler(event:MouseEvent):void { switch (event.target.name) { case "dragbutton" : target.addEventListener(MouseEvent.MOUSE_MOVE,ScaeHandler); target.addEventListener(MouseEvent.MOUSE_UP,EndScaleHandler); break; case "buttonOk" : this.dispatchEvent(new SelectEvent(SelectEvent.COMPLETE)); break; case "buttonCannel" : target.removeEventListener(MouseEvent.MOUSE_MOVE,DrawingHandler); this.dispatchEvent(new SelectEvent(SelectEvent.CANCEL)); trace("ww"); break; } } private function ScaeHandler(event:MouseEvent):void { rect=new Rectangle(rect.x,rect.y,this.target.mouseX - rect.x,this.target.mouseY - rect.y); button.Move(rect.right-button.width,rect.bottom-button.height); buttonOk.Move(rect.x,rect.bottom); buttonCannel.Move(rect.x+60,rect.bottom); DrawRect(pen,rect); event.updateAfterEvent(); } private function EndScaleHandler(event:MouseEvent):void { target.removeEventListener(MouseEvent.MOUSE_MOVE, ScaeHandler); target.removeEventListener(MouseEvent.MOUSE_UP, EndScaleHandler); } //裁剪返回一个位图数据 public function CutIamge(source:Bitmap):Bitmap { return super.getImage(source,rect); } //返回矩形 public function getRect2D():Rectangle { return rect; } //取消 public function Cancel():void { pen.graphics.clear(); rect=null; pen.removeEventListener(MouseEvent.MOUSE_DOWN, startDragHandler); buttonOk.removeEventListener(MouseEvent.MOUSE_DOWN, buttonDownHandler); button.removeEventListener(MouseEvent.MOUSE_DOWN, buttonDownHandler); buttonCannel.removeEventListener(MouseEvent.MOUSE_DOWN, buttonDownHandler); while (target.numChildren>2) { target.removeChildAt(target.numChildren-1); } } } }

制作UI:制作UI的时候,我们需要制作三个按钮也可以更加多,因为我只是实现了一个点。可以进行拖放的控制,因此这种设计会简化,然而对更加多的点支持则需要进行修改完善。

按钮的说明:

第一个按钮用于对矩形的缩放,

第二,第三分布的确定和取消的按钮。 用于交互是否裁剪

用于缩放的时候进行操作。

package org.summerTree.button { //该类为缩放的button 按钮 import flash.display.Sprite; public class SButton extends Sprite { public var LineColor:uint=0x0000ff;//线条颜色 public var FillColor:uint=0xff0000;//填充的颜色 public var FillAlpha:uint=1; public function SButton() { this.buttonMode=true; this.graphics.clear(); this.graphics.lineStyle(1,LineColor,1); this.graphics.beginFill(FillColor,FillAlpha); this.graphics.drawRect(0,0,20,8); this.graphics.endFill(); } public function Move(x:Number,y:Number):void { this.x=x; this.y=y; } } }

取消和确定按钮。

package org.summerTree.button { //该类为缩放的button 按钮 import flash.display.Sprite; import flash.display.Loader; import flash.display.Bitmap; import flash.events.*; import flash.net.URLRequest; public class ButtonBar extends Sprite { public function ButtonBar() { } public function clone():ButtonBar { return new ButtonBar(); } //添加按钮 public function addButton(path:String):void { var loader:Loader=new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete); loader.load(new URLRequest(path)); } private function onComplete(event:Event):void { var bitmap:Bitmap=event.currentTarget.content; addChild(bitmap); event.currentTarget.removeEventListener(Event.COMPLETE,onComplete); } public function Move(x:Number,y:Number):void { this.x=x; this.y=y; } } }

按钮路径

package org.summerTree.button { //按钮路径 public final class ButtonPath { public static const Btn_ok:String="org/summerTree/button/skin/ok.png"; public static const Btn_cannel:String="org/summerTree/button/skin/cannel.png" } }

自定义事件:用于裁剪的位图 自定义的事件

package org.summerTree.event { //裁剪事件 import flash.events.Event; public class SelectEvent extends Event { public static const COMPLETE:String="complete";//完成事件 public static const CANCEL:String="cancel";//取消事件 public function SelectEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) { super(type,false,false); } override public function clone():Event { return new SelectEvent(SelectEvent.COMPLETE); } } }

基本用法:

首先先创建一个Selector 类,用于指定两参数,其中是一个容器,一个是stage 舞台。

在容器当中,我们创建了一个位图,这张位图可以是在库链接出来,也可以外部加载出来的

使用的方法很简单。

import org.summerTree.Selector; import org.summerTree.event.SelectEvent; var contain:MovieClip=new MovieClip(); addChild(contain) var bitmapdata:BitmapData=new Image(0,0); contain.addChild(new Bitmap(bitmapdata)); var myselect:Selector=new Selector(contain,stage); myselect.addActionListener(); myselect.addEventListener(SelectEvent.COMPLETE,cutImageHandler); myselect.addEventListener(SelectEvent.CANCEL,cancelHandler); function cancelHandler(event:SelectEvent):void { myselect.Cancel(); myselect.addActionListener(); } function cutImageHandler(event:SelectEvent):void { var bit:Bitmap=myselect.CutIamge(contain.getChildAt(0) as Bitmap); contain.removeChildAt(0); contain.addChildAt(bit,0); myselect.Cancel(); myselect.addActionListener(); }

下面可以下载来玩一下,看看效果如何。

flash 交互操作:裁剪位图相关推荐

  1. Js与flash交互:在html页面中用js与MyReport插件交互

    <sdt id="89512093" sdtgroup="t" contentlocked="t" sdtlocked="t ...

  2. 【OpenCV 4开发详解】窗口交互操作

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. OGC和Khronos建立合作关系,共同推动地理信息和3D图形社群的交互操作

    2018 年 10 月 10 日: The Open Geospatial Consortium (OGC) 和 The Khronos® Group, 一个由领先硬件和软件公司组成.致力于创建高级加 ...

  4. .NET Framework 2.0 组件和非托管代码与交互操作详解(转)

    .NET Framework 将促进与 COM 组件.COM+ 服务.外部类型库和许多操作系统服务的交互操作.在托管和非托管对象模型之间,数据类型.方法签名和错误处理机制都存在差异.为了简化 .NET ...

  5. 简述php和web交互过程,PHP与Web页面交互操作实例分析

    PHP与Web页面交互操作实例分析,表单,数组,参数,字符串,属性 PHP与Web页面交互操作实例分析 易采站长站,站长之家为您整理了PHP与Web页面交互操作实例分析的相关内容. 本文实例讲述了PH ...

  6. NAND FLASH 读写操作 简介

    NAND FLASH 内存详解与读写寻址方式 一.内存详解 NAND闪存阵列分为一系列128kB的区块(block),这些区块是 NAND器件中最小的可擦除实体.擦除一个区块就是把所有的位(bit)设 ...

  7. H5 vue实现百度下拉列表交互操作示例

    给大家分享一篇关于vue实现百度下拉列表交互操作示例的详细介绍,希望对同学们学习HTML5开发有所帮助,下面我们一起来看一下吧. www.jb51.net vue百度下拉列表 .gray{ backg ...

  8. 解决STM32F0/F1内部FLASH写操作导致中断程序无法响应的问题

    必看链接:试图搞懂MDK程序下载到flash(二)–分散加载文件scatter 参考链接:STM32F10x单片机Flash写操作导致中断不响应问题 最近本人在写STM32F0系列的FLASH写操作的 ...

  9. STM32F10x单片机Flash写操作导致中断不响应问题

    昨天遇到一个问题,在写入数据到STM32F103单片机的Flash中时会出现串口中断接收数据丢失现象,但是我设置的串口接收中断优先级是最高的,并且没有哪里将全局中断关闭很长时间(除了操作系统部分内核代 ...

最新文章

  1. 管理活动目录域服务实训_酒店管理专业开展酒店实训活动
  2. 14-python基础3-数据类型
  3. Nacos源码服务发现
  4. IBASE read header
  5. Oracle多表连接查询
  6. 第六届省赛(软件类)真题----Java大学C组答案及解析
  7. python 以行为单位进行字符串的切割
  8. delphi xe5 android,android – 发送电子邮件Delphi XE5
  9. 我(和谐)草(和谐)尼(和谐)玛
  10. 主板检测卡c5_主板测试卡代码及解决方法
  11. Bundle Adjustment简述
  12. jstl fn 函数
  13. latex 如何输入 双斜杠 单斜杠
  14. 爱马仕橙JOYEAS休闲沙发
  15. C#批量转CSV到Excel
  16. npm安装electron时报Error: EPERM: operation not permitted, scandir.....
  17. 三星android智能手图片机,掌中投影智能机 三星GALAXY Beam2图赏
  18. Qt5.9学习笔记2-输入/显示/按钮/菜单/时间/字体/图片
  19. 7种Dos攻击和防范方法
  20. ArcGIS+Python读取flt文件并进行区域统计

热门文章

  1. 硬件工程师常用的电路基础公式+换算!
  2. csv文件的保存与读取
  3. jmeter录制手机脚本
  4. c语言remainder函数,remainder
  5. 什么是IP65?仅仅是防水等级吗?看完本文直呼666!
  6. 摄像头自建html直播,H5代码实现调用本地摄像头实现实时视频以及拍照功能
  7. MATLAB对水下目标去噪声代码,水下目标噪声与背景噪声的建模与仿真
  8. html向服务器发送请求有哪些方法,HTTP协议客户端是如何向服务器发送请求
  9. matlab数据变成一列数据,matlab读取excel表格列数据-matlab导入excel后,怎么把数据提取成一列?...
  10. 苹果邮箱怎么登录qq邮箱_qq邮箱app下载安装-手机QQ邮箱2020下载v6.1.0 官方安卓版...