1、游标卡尺的认识开发手记最初,我曾用 Authroware 制作了游标卡尺读数训练 ,但其身躯实在庞大,优化后也有 1M 多,伴随着 Flash 开发课件的热潮,我也把其改为 Flash 版。并增加了不少功能。整个程序开发分为两个部分,首先是界面的设计,以及各对象的制作。先要进行一个整体规划,主尺多长、每个线条之间的间距为多少合适都要事先计算好。在制作过程中一定要做到规范化,在绘制游标尺和主尺时,精确是关键,各部分的比例,以及总体规划各部分的位置,都十分重要。在制作过程中,可以充分利用 Flash 的放大功能,选中工具、箭头工具,对各部分形状进行微调。绘制出四套刻度系统,在制作时,一定要精确,可
2、以利用 Information 面板对线条的长度、坐标进行精确定位。对于不同的部分制成不同的零件(MovieClip) ,以供调用。在主界面中,为了达到满意的效果,要合理安排分层,比如游标尺要处于主尺和主尺上面的“内测量爪”部分之间。在游标尺部件中,螺丝要放在尺身的下面。在进行放大镜的设计时用到了遮罩。注意在 Flash 中,遮罩层的对象在函数中是不能移动的,而其整体和被遮盖部分是可移动的。第二个部分就是 ActionScript 代码的编写。这是画龙的点精之笔,只有这一部分,才能使原有的图形活起来。在 Flash 的祯、按钮、影片剪辑上都可以使用 ActionScript。几个关键的 act
3、ion 代码如下:1读数函数function dushu () /读数 在第一祯上sj = (getProperty ( _root.yc, _x )-_root.yccw)/4; /由坐标位置关系求出精确的实际读数if (_root.pp=1) /根据游标尺的类型返回不同的值(为了读数更精确,采用末位四舍五入sj = Math.round (sj*10)/10; else if (_root.pp=2) sj = Math.round (sj*20)/20; /精确度为 0.05 else if (_root.pp=3) sj = Math.round (sj*50)/50; /精确度为 0
4、.02if (sj)=int(sj) /如果读数为整数精确到十分位sj = String ( sj )+“.0“;if (_root.pp1) and (Number (sj)*10)=int(Number (sj)*10) sj = sj+“0“;/如果分度值不是十分度并且只有一位小数则精确到百分位return (sj); /返回读数2 深度尺onClipEvent (mouseMove) setProperty (“_root.sdc“, _x, getProperty ( “_root.yc“, _x )+382); /382 深度尺和游标尺间的距离常数3游标尺onClipEvent (
5、mouseDown) if (_root.yc.LM.kd!=0)and(hitTest( _root._xmouse, _root._ymouse) /开关打开并且鼠标指针在尺上startDrag (“_root.yc“, false, 110.6, 146.7, 430, 146.7); /游标尺拖动范围间的距离常数tellTarget (“_root.mc_ds“) /显示读数play ();onClipEvent (mouseUp) stopDrag ();4紧固螺丝on (release) /开关状态转换if (kd!=0) setProperty (“_root.yc.LM“, _
6、y, getProperty ( “_root.yc.LM“, _y )+2);kd = 0; else setProperty (“_root.yc.LM“, _y, getProperty ( “_root.yc.LM“, _y )-2);kd = 1;5放大按钮on (release) setProperty (“_root.magic“, _visible, true); /打开放大镜magicflag = true;if (magicflag) var x=0;var x1=0;x = (getProperty (_root.yc, _x )-_root.yccw)/4; /由坐标位
7、置关系求出精确的实际读数x1 = x*100-100*int(x); /实际读数的小数点后两位的 100 倍if (pp=“1“) x1 = x1*0.36; / *10*(9/10)*4 /100 (卡尺每分度间隔四象素)(游尺长度*比例系数*每刻度长度 /100 倍) else if (pp=“2“) x1 = x1*0.76; / *20*(19/20)*4/100 else x1 = x1*1.96 / *50*(49/50)*4/100 ;setProperty (“_root.magic“, _x, x*4+59.6+yccw + x1); / 放大镜的位置,59.6 为放大镜在
8、0刻度时和游标尺在 0 刻度时的位置相差常数(x*4)为主尺读数+59.6+yccw)为当前主尺读数坐标亦为游标尺当前零点处坐标)+x1(游标尺当前对其位置处坐标)if (_root.pp = 1) setProperty (“_root.magic.fd10“, _visible, “1“);setProperty (“_root.magic.fd20“, _visible, “0“);setProperty (“_root.magic.fd50“, _visible, “0“); else if (pp = 2) setProperty (“_root.magic.fd10“, _visi
9、ble, “0“);setProperty (“_root.magic.fd20“, _visible, “1“);setProperty (“_root.magic.fd50“, _visible, “0“); else setProperty (“_root.magic.fd10“, _visible, “0“);setProperty (“_root.magic.fd20“, _visible, “0“);setProperty (“_root.magic.fd50“, _visible, “1“);setProperty (“_root.magic.fd“, _xscale, 800)
10、;setProperty (“_root.magic.fd10“, _xscale, 800);setProperty (“_root.magic.fd20“, _xscale, 800);setProperty (“_root.magic.fd50“, _xscale, 800);setProperty (“_root.magic.fd“, _yscale, 200);setProperty (“_root.magic.fd10“, _yscale, 200);setProperty (“_root.magic.fd20“, _yscale, 200);setProperty (“_root
11、.magic.fd50“, _yscale, 200);setProperty (“_root.magic.fd“, _x, -(x*4+x1)*8); /主尺刻度位移量(使刻度线返回到正确位置) setProperty (“_root.magic.fd10“, _x, -(x1)*8); /游标刻度尺刻度位移量setProperty (“_root.magic.fd20“, _x, -(x1)*8);setProperty (“_root.magic.fd50“, _x, -(x1)*8);6放大图形onClipEvent (mouseDown) if (this.hitTest(_root
12、._xmouse,_root._ymouse) setProperty (“_root.magic“, _visible, 0);magicflag = false;7读数ds = _root.dushu();8确定on (release) if (_root.result.da=_root.dushu() setProperty (“_root.dh“, _visible, true);setProperty (“_root.ch“, _visible, false);setProperty (“_root.yc“, _x, _root.yccw+random ( 300 ); else s
13、etProperty (“_root.dh“, _visible, false);setProperty (“_root.ch“, _visible, true);9求救on (release) _root.result.da = _root.dushu();setProperty (“dh“, _visible, “0“);setProperty (“ch“, _visible, “0“);几个关键的变量:jq = “0.1mm“;pp = 1;yccw = 110.6; /游标尺的初始坐标位置magicflag = false;kd!=0ds = _root.dushu();sj = (g
14、etProperty ( _root.yc, _x )-_root.yccw)/4; /由坐标位置关系求出精确的实际读数d1 = int (100*sj)-10*int(10*sj); /百分位d2 = int (10*sj)-10*int(sj); /十分位d3 = int(sj); /整数部分x = (getProperty (_root.yc, _x )-_root.yccw)/4; /由坐标位置关系求出精确的实际读数x1 = x*100-100*int(x); /实际读数的小数点后两位的 100 倍_root.result.da = _root.dushu();几个关键的常量:主尺每分度间距:4pix ; 背景色:#386ca0深度尺坐标:(492.6,155.4) ; 游标尺:(110.6,146.7)59.6 为放大镜在 0 刻度时和卡尺在 0 刻度时的位置相差常数