AS3实现的弹性按钮效果——修订版(原创)
第一次面试失败后回来写的这个程序,因为这个问题被多次提到,贴出来和大家分享。 首先还是直接贴代码吧,两个文件,一个Rect.as,代码如下:
- package {
- import flash.display.Sprite;
- import flash.events.MouseEvent;
- import flash.events.Event;
-
- public class Rect extends Sprite {
- public var border:Number;
- private var color:uint;
- private var big:Number = 1.5;//最大放大倍数
- private var small:Number = 1;//原态
- private var spring:Number = .4;//弹性系数
- private var resistance:Number = .9;//阻力
- private var vX:Number;//X速度
- private var vY:Number;//Y速度
- private var multiple:Number;
-
- public function Rect(a:Number = 40, c:uint = 0xff0000) {
- border = a;
- color = c;
- draw();
- vX = 0;
- vY = 0;
- this.addEventListener(MouseEvent.MOUSE_OVER, onOver);
- this.addEventListener(MouseEvent.MOUSE_OUT, onOut);
- }
- private function draw():void {
- graphics.lineStyle(1);
- graphics.beginFill(color);
- graphics.drawRect(-border / 2, -border / 2, border, border);
- graphics.endFill();
- }
- private function onOver(evt:MouseEvent):void {
- parent.setChildIndex(this, this.parent.numChildren-1);//置于顶层
- multiple = big;//鼠标进入时,将平衡位置设置为big
- addEventListener(Event.ENTER_FRAME, onEnterFrame);
- }
- private function onOut(evt:MouseEvent):void {
- parent.setChildIndex(this, 0);//置于底层
- multiple = small;//鼠标离开时,平衡位置为原态
- addEventListener(Event.ENTER_FRAME, onEnterFrame);
- }
- private function onEnterFrame(evt:Event):void {
- var dx:Number = multiple - this.scaleX;//相当于弹簧的伸长距离了
- if(Math.abs(dx) < 0.005 && vX < .005) {//改进了判定条件->伸长距离为0且速度为0
- removeEventListener(Event.ENTER_FRAME, onEnterFrame);//停止弹性
- } else {
- var ax:Number = dx * spring;//加速度->与伸长距离和弹性系数成正比
- vX += ax;//速度:vt=v0+at
- vX *= resistance;//阻力效果,不然弹性不会停止
- this.scaleX += vX;
- this.scaleY = this.scaleX;
- }
- }
- }
- }
复制代码
另一个是文档类了,在这里看效果,Spring2.as代码如下:
- package {
- import flash.display.Sprite;
- public class Spring2 extends Sprite {
- private var n:int = 3;
- public function Spring2() {
- for(var i:int = 0; i < n; i++) {
- var rect:Rect = new Rect(40);
- rect.x = 100 + 50*i;
- rect.y = 100;
- addChild(rect);
- }
- }
- }
- }
|
|