我学习用的是一本叫《Flash MX ActionScript标准教程》的书,其中有一个例程是放大镜的,先照书上的代码来写,自己再慢慢琢磨改进,最后形成现在这个样子了。
书上的例程,对于放大的计算,根本就是错误的,我自己本来就是学地图的,对坐标转移变换比较了解,分析了一下就解决了,原则就是放大时,放大镜在放大图的位置必须与原图一致,后面我找了一下,网上有位兄弟已贴出类似的贴子,http://www.shendo.cn/archives/nettech/pagecode/Flash/techInfo_8225.html
我个人主要做了两个改进
1、不需要在工程里创建大图,直接在程序里产生
2、由上,可以自由定义放大的倍率,用加减号来控制
具体过程我这里不多说了,以下是代码
主时间轴代码
// ---------------------全局变量---------------------------
// 设置默认放大倍数为2倍
_global.Rate = 2 ;
// ---------------------全局函数---------------------------
// 将指定的图片根据指定的倍数放大(缩小)
_global.SetPicSacle = function (picName,scaleRate) ... {
setProperty (picName, _xscale, scaleRate*100);
setProperty (picName, _yscale, scaleRate*100);
}
// ----------------------主过程-------------------------
// 复制要放大的图片,并命名为largeP
duplicateMovieClip (_root.smallPic, " largeP " , - 1 );
// 根据指定的倍数放大图片
_global.SetPicSacle( " largeP " ,_global.Rate);
// trace(_global.Rate + " " + );
// 开始拖拽放大镜
startDrag( " _root.zoom " , true );
Mouse.hide();
// 设置放大镜的镜片为largeP的蒙板
_root.largeP.setMask(_root.zoom.glass);
放大镜对象zoom的动作代码
//
检测放大镜的移动操作,当其移动时,同步移动放大的图片,使其当前点与图片的当前点在放大镜的中心点吻合
onClipEvent (enterFrame) ... {
//用point保存鼠标当前的坐标位置
point =new Object();
point.x=_root._xmouse;
point.y=_root._ymouse;
//移动largeP的位置,以使当前点与smallPic的当前点在放大镜的中心点吻合
_root.largeP._x=(point.x)*(1-_global.Rate)+_root.smallPic._x*_global.Rate;
_root.largeP._y=(point.y)*(1-_global.Rate)+_root.smallPic._y*_global.Rate;
}
onClipEvent (enterFrame) ... {
//用point保存鼠标当前的坐标位置
point =new Object();
point.x=_root._xmouse;
point.y=_root._ymouse;
//移动largeP的位置,以使当前点与smallPic的当前点在放大镜的中心点吻合
_root.largeP._x=(point.x)*(1-_global.Rate)+_root.smallPic._x*_global.Rate;
_root.largeP._y=(point.y)*(1-_global.Rate)+_root.smallPic._y*_global.Rate;
}
显示图片smallPic的动作代码
//
图片操作,检测放大镜是否在图片范围内,如是执行放大镜拖拽操作,如否,停止放大镜拖拽操作
onClipEvent (enterFrame) ... {
if(hitTest(_root._xMouse,_root._yMouse,false)) ...{
startDrag("_root.zoom",true);
Mouse.hide ();
_root.largeP._visible=1;
_root.zoom._visible=1;
}
else ...{
stopDrag();
Mouse.show ();
_root.largeP._visible=0;
_root.zoom._visible=0;
}
}
// 检测键盘操作,如果有按加减键,则进行放大和缩小操作,改变放大镜的放大倍数,最大为4倍,最小为1倍
onClipEvent (KeyDown) ... {
var code=Key.getCode();
var chg=0;
//按加号
if(code==107 or code==187) ...{
if(_global.Rate<4) ...{
_global.Rate=_global.Rate+0.1;
chg=1;
}
}
//按减号
else if (code==109 or code==189) ...{
if(_global.Rate>1) ...{
_global.Rate=_global.Rate-0.1;
chg=1;
}
}
if(chg=1) ...{
_global.SetPicSacle("largeP",_global.Rate);
}
}
onClipEvent (enterFrame) ... {
if(hitTest(_root._xMouse,_root._yMouse,false)) ...{
startDrag("_root.zoom",true);
Mouse.hide ();
_root.largeP._visible=1;
_root.zoom._visible=1;
}
else ...{
stopDrag();
Mouse.show ();
_root.largeP._visible=0;
_root.zoom._visible=0;
}
}
// 检测键盘操作,如果有按加减键,则进行放大和缩小操作,改变放大镜的放大倍数,最大为4倍,最小为1倍
onClipEvent (KeyDown) ... {
var code=Key.getCode();
var chg=0;
//按加号
if(code==107 or code==187) ...{
if(_global.Rate<4) ...{
_global.Rate=_global.Rate+0.1;
chg=1;
}
}
//按减号
else if (code==109 or code==189) ...{
if(_global.Rate>1) ...{
_global.Rate=_global.Rate-0.1;
chg=1;
}
}
if(chg=1) ...{
_global.SetPicSacle("largeP",_global.Rate);
}
}