as3鱼眼放大镜
package {
//hi.baidu.com/inuko
//bitmapdata fisheye magnifier
//原创代码,如有雷同,纯属巧合
/*
本例是使用近似算法,只是最简单的鱼眼应用。此类绑定一个以0,0为中心,半径R=50的圆即可使用。也可以自行绘制放大镜子。
原理很简单,可以baidu下。
须和被放大的object封在一个mc里。这样bitmapdata.draw比较方便。涉及到层级问题,不这么做执行效率较低。
可以用模糊滤镜使之更平滑,不建议使用。
需要近远调节,可以自行写 放大镜与物件的距离,放大镜与人眼的距离 与 放大倍数的映射关系
this is a proximation. a simple fisheye.bind it with a sprite which has a circle which r=100 in point(0,0),u can draw your own magnifier.
just put it in a movie,and then it can render the parent
the theory is concentric circles filled with different scaled original pictures
可以用tweener做动画 move with tweener class
Tweener.addTween(myMovieClip, {x:10, time:1,onUpdate:magnifier.render});
时间轴动画可以用enterFrame   move in flash
function enterFrameH(e){
   if(currentFrame>arg&¤tFrame<arg){ //动画范围 moving frames range
    magnifier.render()
   }
}
*/
import flash.display.Sprite;
import flash.display.MovieClip;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.filters.BlurFilter
public class magnifier extends Sprite {
   public var scaleMax=2; //最大放缩
   public var scaleMin=1; //最小放缩
   public var scaleStep=32; //精细度,即同新圆数 render steps,as same as concentric circles number
   //预存储提高执行效率   defined these in init function to upgrad efficiency
   private var scaleArr=[];
   private var matrixArr=[];
   private var rArr=[];
   private var spriteArr=[]
   private var nowWidth;    //当前放大镜显示圆的直径,即bimmapdata绘制区域   the rendercircle's width
   public var bmpd=new BitmapData(10,10);
   public var bmpd_=new BitmapData(10,10);
   public var rect;
   public var point=new Point(0,0)
   //public var blur=new BlurFilter(3,3,1) 用模糊滤镜可以更平滑,但是太卡,不建议   make it smoother,but increase the scaleStep is better
   public function magnifier(scaleMax=2,scaleMin=1,scaleStep=32) {
    this.scaleMax=scaleMax;
    this.scaleMin=scaleMin;
    this.scaleStep=scaleStep;
    init();
    //addEventListener("enterFrame",render); //render in each frame,can wirte these outside the class
    render()
   }
   public function init() {
    var d=(scaleMax-scaleMin)/(scaleStep-1);
    if (d<0) {
     scaleMax=scaleMin
     d=0
     return;
    }
    nowWidth=this.scaleX*100;
    for (var i=0; i<=scaleStep; i++) {
     scaleArr[i]=scaleMin+i*d;//先缓冲提高效率,从大带小
     rArr[i]=50*(scaleStep-i+1)/(scaleStep+1);
     matrixArr[i]=new Matrix();
     matrixArr[i].scale(scaleArr[i],scaleArr[i]);
     matrixArr[i].translate(-50*scaleArr[i],-50*scaleArr[i])
     spriteArr[i]=new Sprite()
     //if(i>0){
      //spriteArr[i].filters=[blur] //用模糊滤镜可以更平滑,但是太卡,不建议   make it smoother,but increase the scaleStep is better
     //}
     addChild(spriteArr[i])
    }
   }
   public function render(e=null) {
    var i
    this.visible=false //不显示,以免绘制自身   invisible to avoid draw magnifier self
    rect=new Rectangle(this.x-nowWidth/2,this.y-nowWidth/2,nowWidth,nowWidth); //实际范围 true bitmapdata.draw area
    bmpd.dispose()
    bmpd=new BitmapData(this.parent.width,this.parent.height,true);
    bmpd.draw(this.parent,null,null,null,rect,true); 
    bmpd_.dispose()
    bmpd_=new BitmapData(nowWidth,nowWidth)
    bmpd_.copyPixels(bmpd,rect,point) //拷贝实际范围到新的bitmapdata,方便放缩的matrix计算 copy to a new bitmapdata,so can be easier to calc matrix
    for (i=0; i<=scaleStep; i++) {
     spriteArr[i].graphics.clear()
     //spriteArr[i].graphics.lineStyle(1,0) 圆外框,此行可以帮助理解原理 help to understand&debug
     spriteArr[i].graphics.beginBitmapFill(bmpd_,matrixArr[i],false,true); //填充不同matrix的圆   fill circles with difference matrix
     spriteArr[i].graphics.drawCircle(0,0,rArr[i]);
     spriteArr[i].graphics.endFill();
    }
    this.visible=true
   }
}
}
as3鱼眼放大镜的更多相关文章
- AS3放大镜工具类
		package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Display ... 
- 鱼眼模式(Fisheye projection)的软件实现
		简单实现 鱼眼模式(Fisheye)和普通的透视投影(Perspective projection),一个很大的区别就是鱼眼的投影算法是非线性的(non-linear),实际照相机的情况是在镜头外面包 ... 
- js版面向对象图片放大镜
		<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>放 ... 
- SageCRM 页面加载完后,用下拉框联动修改放大镜字段的取值范围
		原理很简单就是修改放大镜属性中的sql. 函数如下:第一个参数是字段的名称.第二个参数是需要控制这个放大镜的sql.可以跟进下拉框的值来组织这个sql. /*--------------- For C ... 
- 用js实现放大镜的效果
		第一次发博客,还有点小激动,本人现在正在天津上大学,希望以后从事前端这一行业,学习的时间不长,写博客为了记录自己的学习过程和收获,当然也算是巩固.可能写的东西不会像大牛那样高大上,只是一些基本的内容, ... 
- 关于jQuery中实现放大镜效果
		1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向 ... 
- 未封装的js放大镜特效
		<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ... 
- JS 做的鼠标放大镜(初级)
		这今天我们学习鼠标的各种事件,我给大家分享一下鼠标放大镜的效果. 希望有兴趣的朋友可以一块交流. <!DOCTYPE html><html> <head> < ... 
- 酷炫放大镜canvas实现
		主要采用了canvas内渲染canvas的技术,还有利用比例来放大图片 比例:放大镜宽度/画布宽度=原图宽度/渲染图宽度 <!DOCTYPE html><html lang=&quo ... 
随机推荐
- Linux 系统管理——引导过程与服务控制
			一. 系统引导流程 1.开机自检(BIOS)(基本的输入输出系统) 2.MBR引导1.2. MBRIS 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR (Master Boot Record ... 
- 洛谷 P2983 [USACO10FEB]购买巧克力Chocolate Buying 题解
			P2983 [USACO10FEB]购买巧克力Chocolate Buying 题目描述 Bessie and the herd love chocolate so Farmer John is bu ... 
- linux命令之------Find命令
			Find命令 1)作用:用来在指定目录下查找文件. 2)案例:将当前目录及其子目录下所有延申档名是c的文件列出来. Find -name “*.txt” 其中:*表示通配任意个字符:?表示通配单个字符 ... 
- 3D数据采集和重建
			3D数据采集和重建是从传感器数据生成三维或时空模型.一般而言,这些技术和理论适用于大多数或所有传感器类型,包括光学,声学,激光扫描,[1]雷达,热学,[2]地震.[3][4] 内容 · ... 
- 【DataStage】使用Sequence Job报错:CopyOfseq_ld..JobControl (fatal error from @Coordinator): Sequence job (restartable) will abort due to previous unrecoverable errors
			错误描述: 在使用Sequence Job加载作业的时候,报了个错,详细错误内容如下: 出现这个错误的原因是由于以下配置问题,Excution action的状态为Run造成. 解决方案: 将Excu ... 
- D3.js的v5版本入门教程(第十章)
			在这一章我们干点有趣的事——让我们上一章绘制的图表动起来,这样岂不是很有意思 为了让图表动起来,我们还是需要以下新的知识点 .attr(xxx) .transition() .attr(xxx),tr ... 
- 多维矩阵转一维数组(c++)【转载】
			在由二维矩阵转为一维数组时,我们有两种方式:以列为主和以行为主. 以列为主的二维矩阵转为一维数组时,转换公式为: index=column+row×行数 以行为主的二维矩阵转为一维数组时,转换公式为: ... 
- 编译失败,无法安装APK
			编译失败,无法安装APK. 把libs目录中,全部内容清空,再重新编译就可以了. 应该是有些组件有冲突的原因! -------------------------------------------- ... 
- 电商ERP系统——商品SKU与库存设计
			面试题经常问道,如何设计库存,哪些库存呢?分类属性的库存:不同颜色 不同尺码的属性的库存,这时候需要针对具体的SKU商品创建表. 总体思路 1.商品关联商品类别,商品类别关联多个商品属性,其中指定某几 ... 
- semi-join子查询优化 -- FirstMatch策略
			FirstMatch执行semi-join子查询的一种策略. 类似于MySQL 5.x中如何执行in.exists子查询. 让我们以搜索拥有大城市的国家为例: select * from Countr ... 
