package {
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();
}
}
} 使用方法:
var mMagGlass:MagGlass = new MagGlass(mc,3,150,150,true);
addChild(mMagGlass);

  AS3放大镜工具类

AS3放大镜工具类的更多相关文章

  1. 【转】AS3画板工具类,可直接套用

    原文链接:http://bbs.9ria.com/thread-212711-1-16.html 今天项目需求做一个画板,要有橡皮擦.自己懒不想写,在网上搜了半天都是习作,没有拿来就能用的又不爱看.只 ...

  2. as3 工具类分享 CookieMgr

    今天分享一个工具类 CookieMgr,功能就是读取和写入 SharedObject 对象.很简单,都是静态方法,就不多说了 package org.polarbear.core { import f ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Android—关于自定义对话框的工具类

    开发中有很多地方会用到自定义对话框,为了避免不必要的城府代码,在此总结出一个工具类. 弹出对话框的地方很多,但是都大同小异,不同无非就是提示内容或者图片不同,下面这个类是将提示内容和图片放到了自定义函 ...

  5. [转]Java常用工具类集合

    转自:http://blog.csdn.net/justdb/article/details/8653166 数据库连接工具类——仅仅获得连接对象 ConnDB.java package com.ut ...

  6. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

  7. Guava库介绍之实用工具类

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  8. Java程序员的日常—— Arrays工具类的使用

    这个类在日常的开发中,还是非常常用的.今天就总结一下Arrays工具类的常用方法.最常用的就是asList,sort,toStream,equals,copyOf了.另外可以深入学习下Arrays的排 ...

  9. .net使用正则表达式校验、匹配字符工具类

    开发程序离不开数据的校验,这里整理了一些数据的校验.匹配的方法: /// <summary> /// 字符(串)验证.匹配工具类 /// </summary> public c ...

随机推荐

  1. Linux下搭建iSCSI共享存储的方法 Linux-IO Target 方式CentOS7-1810下实现

    iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速 ...

  2. vue 把后端返回的图片和url链接生成的二维码用canvas 合成一张图片

    H5 页面在做某个活动的时候,有两种分享方式,一种是链接分享,一种是图片分享. 链接分享的话,如果是在微信里,就可引导用户利用微信浏览器自带的分享,根据sdk设置分享标题简介链接缩略图即可. 图片分享 ...

  3. async、await总结

    一.async用法 async作为一个关键字放到函数前面,用于表示函数是一个异步函数.异步函数也就意味着该函数的执行不会阻塞后面代码的执行. 异步函数语法很简单,就是在函数前面加上async 关键字, ...

  4. 「2019-8-11提高模拟赛」女装盛宴 (flag)

    传送门 Solution  基环树+倍增+双指针 第一次因为#define int long long而玄学RE 为什么标程都不用开\(long long\)啊 Code  /*玄学RE 看来defi ...

  5. linux常用命名汇总:自用,持续更新

    1.查看磁盘空间大小 df -hl 查看磁盘剩余空间 df -h 查看每个根路径的分区大小 du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文件夹总M数 du -h [目录 ...

  6. durpal安装时The translation server is offline解决

    从https://localize.drupal.org/download下载语言文件上传到 目录/var/www/html/sites/default/files/translations 或者wg ...

  7. HTTP与RPC(Thrift)

    什么是RPC 从网络协议来说,Http协议与Rpc同属于应用层, 他们的底层都是tcp协议. RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Tra ...

  8. git,指南,操作

    助你开始使用 git 的简易指南,木有高深内容,;). Tweet 作者:罗杰·杜德勒 感谢:@tfnico, @fhd and Namics其他语言 english, deutsch, españo ...

  9. Sharding-JDBC 按日期时间分库分表

    简介 Sharding-JDBC 定位为轻量级Java框架,在Java的JDBC层提供的额外服务. 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完 ...

  10. 微信小程序开发——使用第三方插件生成二维码

    需求场景: 小程序中指定页面需要根据列表数据生成多张二维码. 实现方案: 鉴于需要生成多张二维码,可以将生成二维码的功能封装到组件中,直接在页面列表循环中调用就好了.也可以给组件添加slot,在页面调 ...