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 ...
随机推荐
- rac集群状态脚本执行awk拼接有问题
再shell中拿出来拼接没问题,在脚本中运行就有问题,
- 树组件——jstree使用
本文记录的只是我自己当时的代码,每行的注释很清楚了,你自己可以做相应变通 一.使用前提: 1.下载jstree依赖包 2.相关页面引入样式["jstree/themes/default/st ...
- vuex如何实现数据持久化,刷新页面存储的值还存在
1.安装: npm install vuex-persistedstate --save 2.找到store/index.js import Vue from 'vue' import Vuex fr ...
- hdfs、yarn集成ranger
一.安装hdfs插件 从源码安装ranger的服务器上拷贝hdfs的插件到你需要安装的地方 1.解压安装 # tar zxvf ranger-2.1.0-hdfs-plugin.tar.gz -C / ...
- 关于python的深拷贝和浅拷贝
写类函数的时候出了一个错,原代码写在这里: def Update(self, wm, vm, ts, pos, vn, att): # 上一时刻位置,速度 pos_pre = pos self.pos ...
- jmeter(四十四)常用性能指标分析
概述 我们在用jmeter做性能测试的时候,有一些关键性的性能指标需要去分析.但是由于开源工具本身的局限性,这些指标在工具中的命名极易对我们造成混淆.所以我们需要对这些指标一一进行剖析. 指标分析 响 ...
- Confd+Consul 动态生成配置文件
一.Consul安装和配置 1.consul是什么? consul是HashiCorp公司推出的一款工具,主要用于实现分布式系统的服务发现与配置,它提供了以下几个关键特性: 服务发现:Consul客户 ...
- IOC注解方式1.0
在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0" encoding=& ...
- SQLSERVER教师学生成绩课程四表联合各种SQL考题
--CREATE DATABASE EXAM_1 --GO USE EXAM_1 --判断并删除表 IF OBJECT_ID('Scores') IS NOT NULL DROP TABLE Scor ...
- oracle update from多表性能优化一例
这几天测试java内存数据库,和oracle比较时发下一个update from语句很慢,如下: update business_new set fare1_balance_ratio = (sele ...