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 ...
随机推荐
- javascript之随机密码[必包含大写,小写,数字]
js取两个数字之间的随机数: parseInt(Math.random()*(上限-下限+1)+下限) 如:取1-10之间的随机数 parseInt(Math.random()*(10-1+1)+ ...
- mysql开放远程连接
1.检查端口是否被监听,没有的话请启动mysql. netstat -atnp | grep 3306 2.检查用户是否具备远程连接,即host字段值不是 % mysql -uroot -p你的密码 ...
- VSCode 本地如何查看历史页面
1.首先要在VSCode的扩展中安装一个 Local history插件,蓝色框部分不用管,直接安装即可 2.安装并操作:安装后,修改 productManage/supplierList/addSu ...
- mysql 分组和排序
mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...
- C++2.0新特性(六)——<Smart Pointer(智能指针)之shared_ptr>
Smart Pointer(智能指针)指的是一类指针,并不是单一某一个指针,它能知道自己被引用的个数以至于在最后一个引用消失时销毁它指向的对象,本文主要介绍C++2.0提供的新东西 一.Smart P ...
- NIO 选择器 Selector
选择器提供选择执行已经就绪的任务的能力,这使得多元 I/O 成为可能.就像在第一章中描述的那样,就绪选择和多元执行使得单线程能够有效率地同时管理多个 I/O 通道(Channels).C/C++代码的 ...
- 【软工实践】Beta冲刺(3/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 新增数据分析展示等功能API 服务器后端部署,API接口的beta版实现 展示 ...
- IDEA文件查找功能失效(ctrl+shift+N)
由于断电.蓝屏引起的强制关机等情况,会导出IDEA文件查找功能失效,Enter file name窗口输入的文字显示红色,无法查出需要的文件. 解决方法: 可以点击File,选择Invalidate ...
- The fileSyncDll.ps1 is not digitally signed. You cannot run this script on the current system.
https://www.opentechguides.com/how-to/article/powershell/105/powershel-security-error.html Unblockin ...
- Nginx配置简单负载均衡
前提:因为本次需要两个软件在本机不同端口提供http服务,于是我准备一个tomcat在8080端口,另一个nodejs程序在3000端口,前者自不用提,后者可以到https://www.cnblogs ...