AS3放大镜工具类

2010年01月06日  , ,  Libins  20 次浏览  
0

Comments

之前在天地会看到有人询问此功能的做法,又有网友贴出了一个国外类似功能的,
出处在:http://www.flashandmath.com/intermediate/magglass/index.html

它这个使用不太方便,所以我自己把它的功能做成了一个类文件,方便使用,代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package cn.libins.tool{
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.display.DisplayObject;
 import flash.display.DisplayObjectContainer;
 import flash.display.Sprite;
 import flash.geom.Point;
 import flash.geom.Rectangle;
 import flash.ui.Mouse;
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.filters.DropShadowFilter;
 
 public class MagGlass extends Sprite {
  private const MAXSIZE       :uint  = 2880;
  private var _zoom           :Number;
  private var _zoomSmall      :Number;
  private var _imageW         :Number;
  private var _imageH         :Number;
  private var _imageBitmap    :Bitmap;
  private var _newBitmap      :Bitmap;
  private var _imageBitmapData:BitmapData;
  private var _dataW          :Number;
  private var _dataH          :Number;
  private var _filtered       :Boolean;
  private var _glassSp        :Sprite;
  private var _isZooming      :Boolean;
  private var _Stage          :Object;
  private var _target         :DisplayObject;
   /*
   * Param1 需要缩放的对象
   * Param2 缩放的倍数,默认为3倍
   * Param3 显示框的宽度
   * Param4 显示框的高度
   * Param5 是否添加阴影滤镜
   */
  public function MagGlass($target:DisplayObject, $zoom:Number = 3, $width:Number = 100, $height:Number = 80, $filtered:Boolean = true) {
   trace("MagGlass v01");
   if ($target is Bitmap) {
        _imageBitmap = $target as Bitmap;
   }else {
     _imageBitmap = getBitmap($target);
   }
   _imageBitmap.scaleX = $zoom;
   _imageBitmap.scaleY = $zoom;
   if (_imageBitmap.width > MAXSIZE || _imageBitmap.width > MAXSIZE) {
      trace("图片尺寸超过范围!");
         return;
   }
   var newSp:Sprite    = new Sprite();
   newSp.addChild(_imageBitmap);
   _newBitmap          = getBitmap(newSp);
   _imageBitmapData    = _newBitmap.bitmapData;
   _target             = $target;
   _zoom               = $zoom;
   _imageW             = $width;
   _imageH             = $height;
   _filtered           = $filtered;
   this.addEventListener(Event.ADDED_TO_STAGE, addToStage);
  }
 
  private function addToStage(event:Event):void {
   this.removeEventListener(Event.ADDED_TO_STAGE, addToStage);
   _Stage = stage;
   initGlass();
   initEvent(_target);
  }
 
  private function initGlass():void {
   _glassSp = new Sprite();
   _glassSp.buttonMode = _glassSp.mouseChildren = _glassSp.mouseEnabled = false;
   if(_filtered) _glassSp.filters = [new DropShadowFilter()];
   addChild(_glassSp);
  }
 
  private function initEvent($target:DisplayObject):void {
    $target.addEventListener(MouseEvent.ROLL_OUT,  targetOut,true);
             $target.addEventListener(MouseEvent.MOUSE_DOWN, targetDown);
       _Stage.addEventListener(MouseEvent.MOUSE_UP,  targetOut);
  }
 
  private function targetDown(event:MouseEvent):void {
   _isZooming = true;
   Mouse.hide();
   var hitPoint:Point = new Point(event.localX, event.localY);
   //trace("hitPoint",hitPoint);
   _glassSp.x = this.mouseX- _imageW / 2;
   _glassSp.y = this.mouseY- _imageH / 2;
   ShowBig(hitPoint);
 
   this.addEventListener(MouseEvent.MOUSE_MOVE,targetMove);
  }
 
  private  function glassClear():void {
       _glassSp.graphics.clear();
     }
  private function targetOut(event:MouseEvent):void {
    _isZooming = false;
    glassClear();
    Mouse.show();
    this.removeEventListener(MouseEvent.MOUSE_MOVE,targetMove);
  }
 
  private function targetMove(event:MouseEvent):void {
      var movePoint:Point = new Point(_target.mouseX, _target.mouseY);
      //trace("movePoint",movePoint);
      _glassSp.x         = this.mouseX- _imageW / 2;
      _glassSp.y         = this.mouseY- _imageH / 2;
      ShowBig(movePoint);
      event.updateAfterEvent();
  }
 
  private function getBitmap($target:DisplayObject):Bitmap {
   var bitmapData:BitmapData = new BitmapData($target.width, $target.height,true,0xffff0000);
   bitmapData.draw($target);
   return new Bitmap(bitmapData);
  }
 
  /*
   * Param1 坐标,即需要显示的坐标中点
   */
  private function ShowBig($point:Point) {
   drawGlass(new Point($point.x*_zoom,$point.y*_zoom));
  }
 
  private function drawGlass($point:Point):void {
    var curBitmapData:BitmapData;
    var curBitmap    :Bitmap;
    var startX       :Number = $point.x - _imageW / 2;
    var startY       :Number = $point.y - _imageH / 2;
    curBitmap                = new Bitmap(new BitmapData(_imageW, _imageH));
    curBitmap.bitmapData.copyPixels(_imageBitmapData, new Rectangle(startX, startY, _imageW, _imageH), new Point(0, 0));
    curBitmapData            = curBitmap.bitmapData;
    _glassSp.graphics.clear();
    _glassSp.graphics.lineStyle();
    _glassSp.graphics.beginBitmapFill(curBitmapData);
    _glassSp.graphics.drawRect(0, 0, _imageW, _imageH);
    _glassSp.graphics.endFill();
  }
 }
}

使用也很简单,可以对舞台的可视对象进行缩放

import cn.libins.tool.MagGlass;
var mMagGlass:MagGlass = new MagGlass(mc,5,150,150);
addChild(mMagGlass);

这样我们就可以对舞台,实例为mc的对象进行缩放了。

~请在下图中点击鼠标预览效果~

The Flash plugin is required to view this object.

Tags: , ,

Leave a Reply