分享

AS3实现的弹性按钮效果——修订版(原创)

 灵岩侠客 2011-09-12
AS3实现的弹性按钮效果——修订版(原创)
第一次面试失败后回来写的这个程序,因为这个问题被多次提到,贴出来和大家分享。
首先还是直接贴代码吧,两个文件,一个Rect.as,代码如下:
  1. package {
  2.         import flash.display.Sprite;
  3.         import flash.events.MouseEvent;
  4.         import flash.events.Event;
  5.        
  6.         public class Rect extends Sprite {
  7.                 public var border:Number;
  8.                 private var color:uint;
  9.                 private var big:Number = 1.5;//最大放大倍数
  10.                 private var small:Number = 1;//原态
  11.                 private var spring:Number = .4;//弹性系数
  12.                 private var resistance:Number = .9;//阻力
  13.                 private var vX:Number;//X速度
  14.                 private var vY:Number;//Y速度
  15.                 private var multiple:Number;
  16.                
  17.                 public function Rect(a:Number = 40, c:uint = 0xff0000) {
  18.                         border = a;
  19.                         color = c;
  20.                         draw();
  21.                         vX = 0;
  22.                         vY = 0;
  23.                         this.addEventListener(MouseEvent.MOUSE_OVER, onOver);
  24.                         this.addEventListener(MouseEvent.MOUSE_OUT, onOut);
  25.                 }
  26.                 private function draw():void {
  27.                         graphics.lineStyle(1);
  28.                         graphics.beginFill(color);
  29.                         graphics.drawRect(-border / 2, -border / 2, border, border);
  30.                         graphics.endFill();
  31.                 }
  32.                 private function onOver(evt:MouseEvent):void {
  33.                         parent.setChildIndex(this, this.parent.numChildren-1);//置于顶层
  34.                         multiple = big;//鼠标进入时,将平衡位置设置为big
  35.                         addEventListener(Event.ENTER_FRAME, onEnterFrame);
  36.                 }
  37.                 private function onOut(evt:MouseEvent):void {
  38.                         parent.setChildIndex(this, 0);//置于底层
  39.                         multiple = small;//鼠标离开时,平衡位置为原态
  40.                         addEventListener(Event.ENTER_FRAME, onEnterFrame);
  41.                 }
  42.                 private function onEnterFrame(evt:Event):void {
  43.                         var dx:Number = multiple - this.scaleX;//相当于弹簧的伸长距离了
  44.                         if(Math.abs(dx) < 0.005 && vX < .005) {//改进了判定条件->伸长距离为0且速度为0
  45.                                 removeEventListener(Event.ENTER_FRAME, onEnterFrame);//停止弹性
  46.                         } else {
  47.                                 var ax:Number = dx * spring;//加速度->与伸长距离和弹性系数成正比
  48.                                 vX += ax;//速度:vt=v0+at
  49.                                 vX *= resistance;//阻力效果,不然弹性不会停止
  50.                                 this.scaleX += vX;
  51.                                 this.scaleY = this.scaleX;
  52.                         }
  53.                 }
  54.         }
  55. }
复制代码
另一个是文档类了,在这里看效果,Spring2.as代码如下:
  1. package {
  2. import flash.display.Sprite;
  3. public class Spring2 extends Sprite {
  4. private var n:int = 3;
  5. public function Spring2() {
  6. for(var i:int = 0; i < n; i++) {
  7. var rect:Rect = new Rect(40);
  8. rect.x = 100 + 50*i;
  9. rect.y = 100;
  10. addChild(rect);
  11. }
  12. }
  13. }
  14. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多