经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 4363|回复: 8

[AS3] AS3练习,涂丫板。简单得不能再简单

[复制链接]
发表于 2008-4-12 22:13:02 | 显示全部楼层 |阅读模式
只有一个文档类
  1. package {
  2.         import flash.display.Sprite;
  3.         import flash.events.Event;
  4.         import flash.events.MouseEvent;
  5.         import fl.controls.Button;
  6.         import fl.controls.ComboBox;
  7.         import fl.controls.ColorPicker;
  8.         import fl.events.ColorPickerEvent;
  9.         import fl.events.ListEvent;
  10.         public class SampleTuya extends Sprite {
  11.                 private var __color_cp:ColorPicker;
  12.                 private var __line_cb:ComboBox;
  13.                 private var __prev_btn:Button;
  14.                 private var __clear_btn:Button;
  15.                 private var hit_sprite:Sprite;
  16.                 private var draw_array:Array;
  17.                 private var now_sprite:Sprite;
  18.                 private var l:uint;
  19.                 private var color:uint;
  20.                 public function SampleTuya():void {
  21.                         __color_cp=getChildByName("color_cp") as ColorPicker;
  22.                         __line_cb=getChildByName("line_cb") as ComboBox;
  23.                         __prev_btn=getChildByName("prev_btn") as Button;
  24.                         __clear_btn=getChildByName("clear_btn") as Button;
  25.                         hit_sprite=new Sprite;
  26.                         draw_array=new Array;
  27.                         l=2;
  28.                         color=0x0000;
  29.                         init();
  30.                 }
  31.                 private function init():void {
  32.                         addItemHandler();
  33.                         drawHitSprite();
  34.                         __color_cp.addEventListener(ColorPickerEvent.CHANGE ,onColorChange);
  35.                         __line_cb.addEventListener(Event.CHANGE  ,onLineChange);
  36.                         __prev_btn.addEventListener(MouseEvent.CLICK ,onBtnClick);
  37.                         __clear_btn.addEventListener(MouseEvent.CLICK ,onBtnClick);
  38.                         hit_sprite.addEventListener(MouseEvent.MOUSE_DOWN ,onmouseDown);

  39.                 }
  40.                 private function onmouseDown(_evt:MouseEvent):void {
  41.                         var _sprite:Sprite =_evt.currentTarget as Sprite;
  42.                         _sprite.addEventListener(MouseEvent.MOUSE_MOVE,onmouseMove);
  43.                         _sprite.addEventListener(MouseEvent.MOUSE_UP ,onmouseUp);
  44.                         now_sprite=new Sprite;
  45.                         now_sprite.graphics.lineStyle(l,color);
  46.                         now_sprite.graphics.moveTo(hit_sprite.mouseX,hit_sprite.mouseY);
  47.                         hit_sprite.addChild(now_sprite);
  48.                         draw_array.push(now_sprite);
  49.                 }
  50.                 private function onmouseMove(_evt:MouseEvent):void {
  51.                         var _sprite:Sprite =_evt.currentTarget as Sprite;
  52.                         now_sprite.graphics.lineTo(hit_sprite.mouseX,hit_sprite.mouseY);
  53.                 }
  54.                 private function onmouseUp(_evt:MouseEvent):void {
  55.                         var _sprite:Sprite =_evt.currentTarget as Sprite;
  56.                         _sprite.removeEventListener(MouseEvent.MOUSE_MOVE,onmouseMove);
  57.                         _sprite.removeEventListener(MouseEvent.MOUSE_UP ,onmouseUp);
  58.                 }
  59.                 private function drawHitSprite():void {
  60.                         hit_sprite.graphics.beginFill(0x0000ff,.2);
  61.                         hit_sprite.graphics.drawRect(0,0,stage.stageWidth*.96,stage.stageHeight*.8);
  62.                         hit_sprite.x=10;
  63.                         hit_sprite.y=60;
  64.                         addChild(hit_sprite);
  65.                 }
  66.                 private function addItemHandler():void {
  67.                         for (var p:uint =1; p<=20; p+=2) {
  68.                                 __line_cb.addItem({label:p,value:p});
  69.                         }
  70.                 }
  71.                 private function onColorChange(_evt:ColorPickerEvent):void {
  72.                         var _cp:ColorPicker =_evt.target as ColorPicker;
  73.                         color=uint("0x"+_cp.hexValue);
  74.                 }
  75.                 private function onLineChange(_evt:Event):void {
  76.                         var _cb:ComboBox =_evt.target as ComboBox;
  77.                         l=_cb.selectedItem.value;
  78.                 }
  79.                 private function onBtnClick(_evt:MouseEvent):void {
  80.                         var _btn:Button=_evt.target as Button;
  81.                         _btn==__prev_btn?prev_func():(_btn==__clear_btn?clear_func():null);
  82.                 }
  83.                 private function prev_func():void {
  84.                         hit_sprite.removeChild(draw_array.pop());
  85.                 }
  86.                 private function clear_func():void {
  87.                         var len:uint =draw_array.length
  88.                         for (var p:uint =0; p<len; p++) {
  89.                                 hit_sprite.removeChild(draw_array.pop());
  90.                         }
  91.                 }
  92.         }
  93. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2008-4-12 22:40:18 | 显示全部楼层
我偶像推崇的 FLEX涂鸦板
http://www.splashup.com/splashup/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2008-12-15 11:14:43 | 显示全部楼层

:)

呵,这个涂鸦版本很好呀,就是没有保存功能,不实用
发表于 2008-12-17 14:54:41 | 显示全部楼层

LZ的代码确实十分简洁

我这里也做了一个和LZ一样的简单涂鸦板,功能和LZ的一样,只不过加入了用命令模式实现的redo、undo和输出图片功能。
这里我贴几个核心类。

1 命令类--画线
  1. package command{
  2.        
  3.         import flash.events.MouseEvent;
  4.         import flash.display.Sprite;
  5.     import flash.geom.Point;
  6.        
  7.         public class DrawLineCommand implements ICommand {
  8.                 protected var m_canvas:Sprite;
  9.                 protected var m_layer:Sprite;
  10.                 protected var m_start:Point;
  11.                 protected var m_dotList:Array;
  12.                 protected var m_thickness:Number;
  13.                 protected var m_color:uint;
  14.                 protected var m_alpha:Number;
  15.                
  16.                 public function DrawLineCommand(canvas:Sprite, thickness:Number = 1, color:uint = 0x000000, aplha:Number = 1) {
  17.                         m_canvas = canvas;
  18.                         m_dotList = new Array();
  19.                         m_thickness = thickness;
  20.                         m_color = color;
  21.                         m_alpha = aplha;
  22.                 }
  23.                
  24.                 public function execute():void {
  25.                         m_layer = new Sprite();
  26.                         m_canvas.addChild(m_layer);
  27.                         m_layer.graphics.lineStyle(m_thickness, m_color, m_alpha);
  28.                         //
  29.                         if (m_dotList.length == 0) {
  30.                                 m_layer.graphics.moveTo(m_canvas.mouseX, m_canvas.mouseY);
  31.                                 m_start = new Point(m_canvas.mouseX, m_canvas.mouseY);
  32.                                 m_dotList = new Array();
  33.                                 m_canvas.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove_handler);
  34.                                 m_canvas.addEventListener(MouseEvent.MOUSE_UP, onMouseUp_handler);
  35.                                 m_canvas.addEventListener(MouseEvent.ROLL_OUT, onMouseUp_handler);
  36.                         }else {
  37.                                 //重现
  38.                                 m_layer.graphics.moveTo(m_start.x, m_start.y);
  39.                                 for (var i:uint = 0; i < m_dotList.length; i++) {
  40.                                         var p:Point = m_dotList[i];
  41.                                         m_layer.graphics.lineTo(p.x, p.y);
  42.                                 }
  43.                         }
  44.                 }
  45.                
  46.                 public function undo():void {
  47.                         m_canvas.removeChild(m_layer);
  48.                 }
  49.                
  50.                 protected function onMouseMove_handler(e:MouseEvent):void {
  51.                         m_layer.graphics.lineTo(m_canvas.mouseX, m_canvas.mouseY);
  52.                         var p:Point = new Point(m_canvas.mouseX, m_canvas.mouseY);
  53.                         m_dotList.push(p);
  54.                 }
  55.                
  56.                 protected function onMouseUp_handler(e:MouseEvent):void {
  57.                         m_canvas.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove_handler);
  58.                         m_canvas.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp_handler);
  59.                         m_canvas.removeEventListener(MouseEvent.ROLL_OUT, onMouseUp_handler);
  60.                 }
  61.                
  62.         }
  63. }
复制代码


2 工具类--输出图片
  1. package com.ibio.images {
  2.        
  3.         import com.adobe.images.JPGEncoder;
  4.         import com.adobe.images.PNGEncoder;
  5.        
  6.         import flash.display.DisplayObject;
  7.         import flash.display.Bitmap;
  8.         import flash.display.BitmapData;
  9.         import flash.net.URLRequest;
  10.         import flash.net.URLRequestHeader;
  11.         import flash.net.URLRequestMethod;
  12.         import flash.net.navigateToURL;
  13.         import flash.geom.Matrix;
  14.         import flash.utils.ByteArray;
  15.        
  16.         public class PrintImage {
  17.                
  18.                 protected var m_photo:DisplayObject;
  19.                 protected var m_angle:Number = 0;
  20.                 protected var m_encodeMode:uint = 0;
  21.                 protected var m_quality:uint = 80;
  22.                
  23.                 public function PrintImage(source:DisplayObject = null, url:String = null) {
  24.                         if (source != null) {
  25.                                 m_photo = source;
  26.                         }
  27.                         if (url != null) {
  28.                                 printToURL(url);
  29.                         }
  30.                 }
  31.                
  32.                 /**
  33.                  * 设置源
  34.                  * value 要输出的源
  35.                  */
  36.                 public function set source(value:DisplayObject):void {
  37.                         m_photo = value;
  38.                 }
  39.                
  40.                 /**
  41.                  * 设置角度
  42.                  * angle 角度
  43.                  */
  44.                 public function set rotation(angle:Number):void {
  45.                         m_angle = angle;
  46.                 }
  47.                
  48.                 /**
  49.                  * 设置图像编码模式和JPG编码质量
  50.                  * @param        mode 0为JPG,1为PNG
  51.                  * @param        quality = 80
  52.                  */
  53.                 public function setEncodeMode(mode:uint, quality = 80) {
  54.                         m_encodeMode = mode;
  55.                         m_quality = quality;
  56.                 }
  57.                
  58.                 public function printToURL(url:String):void {
  59.                         var bitmapData:BitmapData = convert(m_photo, m_angle);
  60.                         var imgStream:ByteArray = encodeImg(bitmapData, m_encodeMode, m_quality);
  61.                         postData(url, imgStream);
  62.                 }
  63.                
  64.                 public function postData(url:String, imgStream:ByteArray):void {
  65.                         var jpgURLRequest:URLRequest = new URLRequest(url);
  66.                         var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
  67.                         jpgURLRequest.requestHeaders.push(header);
  68.                         jpgURLRequest.method = URLRequestMethod.POST;
  69.                         jpgURLRequest.data = imgStream;
  70.                         navigateToURL(jpgURLRequest, "_self");
  71.                 }
  72.                
  73.                 public function toString():String {
  74.                         var bitmapData:BitmapData = convert(m_photo, m_angle);
  75.                         var imgStream:ByteArray = encodeImg(bitmapData, m_encodeMode, m_quality);
  76.                         return imgStream.toString();
  77.                 }
  78.                
  79.                 public function encodeImg(bitmapData:BitmapData, mode:uint = 0, quality = 50):ByteArray {
  80.                         var imgStream:ByteArray;
  81.                         if (mode == 0) {
  82.                                 var jpgEncoder:JPGEncoder = new JPGEncoder(quality);
  83.                                 imgStream = jpgEncoder.encode(bitmapData);
  84.                         }else if (mode == 1) {
  85.                                 imgStream = PNGEncoder.encode(bitmapData);
  86.                         }
  87.                         return imgStream;
  88.                 }
  89.                
  90.                 public function convert(image:DisplayObject, angle:Number = 0):BitmapData {
  91.                         var rotateMode:uint = 0;
  92.                         //目前仅支持4个方向
  93.                         if (Math.abs((angle + 360) % 360) == 0) {
  94.                                 rotateMode = 0;
  95.                         }else if (Math.abs((angle + 360) % 360) == 90) {
  96.                                 rotateMode = 1;
  97.                         }else if (Math.abs((angle + 360) % 360) == 180) {
  98.                                 rotateMode = 2;
  99.                         }else if (Math.abs((angle + 360) % 360) == 270) {
  100.                                 rotateMode = 3;
  101.                         }
  102.                         //
  103.                         var tx:Number = 0;
  104.                         var ty:Number = 0;
  105.                         //位移转换
  106.                         if (rotateMode == 0) {
  107.                                 tx = 0;
  108.                                 ty = 0;
  109.                         }else if (rotateMode == 1) {
  110.                                 tx = image.height;
  111.                                 ty = 0;
  112.                         }else if (rotateMode == 2) {
  113.                                 tx = image.width;
  114.                                 ty = image.height;
  115.                         }else if (rotateMode == 3) {
  116.                                 tx = 0;
  117.                                 ty = image.width;
  118.                         }
  119.                         var myMatrix:Matrix = new Matrix();
  120.                         //转换为弧度
  121.                         var radians:Number = (angle/180) * Math.PI;
  122.                         myMatrix.createBox(1, 1, radians, tx, ty);
  123.                         //大小转换
  124.                         var w:Number = 0;
  125.                         var h:Number = 0;
  126.                         if ((rotateMode == 0) || (rotateMode == 2)) {
  127.                                 w = image.width;
  128.                                 h = image.height;
  129.                         }else if ((rotateMode == 1) || (rotateMode == 3)) {
  130.                                 w = image.height;
  131.                                 h = image.width;
  132.                         }
  133.                         var bitmapData:BitmapData = new BitmapData(w, h);
  134.                         bitmapData.draw(image, myMatrix, null, null, null, true);
  135.                         return bitmapData;
  136.                 }
  137.         }
  138. }
复制代码


3 服务器端程序
这里我选择的是用PHP来实现输出图片
  1. <?php
  2. if (isset($GLOBALS["HTTP_RAW_POST_DATA"])){

  3.         // get bytearray
  4.         $jpg = $GLOBALS["HTTP_RAW_POST_DATA"];

  5.         // add headers for download dialog-box
  6.         header("Content-Type: image/jpeg");

  7.         header("Content-Disposition: attachment; filename=".$_GET['name']);

  8.         echo $jpg;
  9. }else{
  10.         echo "没有任何图片";
  11. }
复制代码


好了,就这么多,简单吧。如果需要完整文件测试的,见附件。
注:测试此程序需要有webService的支持。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2008-12-17 15:26:45 | 显示全部楼层
还行吧~!~
加了些组件,不过有些简单,基本上画不出啥东东来。嘎嘎
发表于 2008-12-22 21:59:58 | 显示全部楼层
ibio大哥,我下载并拜读了你的涂鸦板大作,别的地方都明白,只是对你那个ICommand接口在这个作品中的作用不明白,我觉得没有那个接口也应该是可以的,能说一下它的作用吗?
发表于 2008-12-22 23:25:05 | 显示全部楼层
收藏4楼的
发表于 2008-12-23 21:17:38 | 显示全部楼层
?????
发表于 2009-11-15 16:15:36 | 显示全部楼层
提醒:最后回贴距现在 327 天,请不要无意义回复
原帖由 [i]haoxue 于 2008-12-22 21:59 发表
ibio大哥,我下载并拜读了你的涂鸦板大作,别的地方都明白,只是对你那个ICommand接口在这个作品中的作用不明白,我觉得没有那个接口也应该是可以的,能说一下它的作用吗?


作用就是用来扩展
其它的命令也会从icommand实现
在不定是什么命令的方法里可以用icommand泛化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 京ICP备05002321号   

GMT+8, 2015-5-12 00:07 , Processed in 0.112897 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表