之前在天地会看到有人询问此功能的做法,又有网友贴出了一个国外类似功能的,
出处在: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的对象进行缩放了。
~请在下图中点击鼠标预览效果~
Tags: ActionScript, AS3, Flash
Comments