`

[转] 鼠标缓动跟随

阅读更多
http://bbs.9ria.com/viewthread.php?tid=81628&extra=page%3D1%26amp%3Borderby%3Ddateline%26amp%3Bfilter%3D2592000


发个小小的鼠标缓动跟随效果,看了《Making Things Move》后将里面的鼠标跟随扩展了一下
EaseToMouse.as
package {
        import animation.trigonometry.ArrowByLoad;
        import flash.display.Sprite;
        import flash.events.Event;

        /**
         * @author Maliu
         */
        [SWF(frameRate = 30)]        //这里的元数据标签要Flex SDK才支持,Flash IDE不支持
        public class EaseToMouse extends Sprite
        {
                private var arrow:ArrowByLoad;        //鼠标跟随的元件,外部载入
                private var easing:Number = 0.5; //缓动值,决定跟随速度的快慢,可自己尝试修改该值以观察效果
                private var vx:Number = 0;        //x轴速度
                private var vy:Number = 0;        //y轴速度
                private var angle:Number;        //角度,由dy与dx得到
                private var dx:Number;        //目标与当前元件的x轴距离
                private var dy:Number;        //目标与当前元件的y轴距离
                
                private var arrowArray : Array;        //储存跟随对象的数组
                private const numArrow:Number = 10;        //跟随对象的数目
                private const scaleValue:Number = 0.86;        //基础缩放值
                
                public function EaseToMouse()
                {
                        init();
                }
                //初始化
                private function init():void
                {
                        arrowArray = new Array();
                        for(var i:int = 0; i<numArrow; i++)
                        {
                                arrow = new ArrowByLoad();
                                addChild(arrow);
                                arrowArray.push(arrow);
                        }
                        this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                        arrow.addEventListener(Event.COMPLETE, setScale); //侦听加载事件的完成,解决异步引起的不能缩小元件的问题
                }
                private function onEnterFrame(e:Event):void
                {
                        for(var i:int = 0; i<numArrow; i++)
                        {
                                //因为数组里不包含鼠标的坐标,因此分开判断进行不同的传值
                                if(i > 0)
                                {
                                        calEvery(arrowArray[i-1].x, arrowArray[i-1].y, arrowArray[i]);
                                }
                                else
                                {
                                        calEvery(mouseX, mouseY, arrowArray[i]);
                                }
                        }
                }
                //计算传入currentArrow的rotation,需要传入dx和dy
                private function calRotation(currentArrow:ArrowByLoad, dx:Number, dy:Number):void
                {
                        angle = Math.atan2(dy, dx);
                        currentArrow.rotation = angle * 180/Math.PI;
                }
                //计算每个元件的缓动,传入不同的目标值和缓动对象
                private function calEvery(targetX:Number, targetY:Number, currentArrow:ArrowByLoad):void
                {
                        dx = targetX - currentArrow.x;
                        dy = targetY - currentArrow.y;
                        if(Math.abs(dx)<1 && Math.abs(dy)<1)
                        {
                                vx = 0;
                                vy = 0;
                                //currentArrow.x = targetX;
                                //currentArrow.y = targetY;
                        }
                        else
                        {
                                vx = dx * easing;
                                vy = dy * easing;
                                calRotation(currentArrow, dx, dy);
                                //currentArrow.x += vx;
                                //currentArrow.y += vy;
                        }
                        currentArrow.x += vx;
                        currentArrow.y += vy;
                }
                //给每个元件赋予不同的缩放值和透明度
                private function setScale(e:Event):void
                {
                        var n:Number = this.numChildren;
                        var tempScale:Number = 0;
                        var temp:ArrowByLoad;
                        for(var i:int = 0; i<n; i++)
                        {
                                temp = arrowArray[i];
                                tempScale = Math.pow(scaleValue, i);
                                temp.scaleX = tempScale;
                                temp.scaleY = tempScale;
                                temp.alpha = tempScale;
                        }
                }
        }
}


其中元件是外部加载的图像,以下是加载的代码
ArrowByLoad.as
package animation.trigonometry {
        import flash.display.Bitmap;
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;

        /**
         * @author Maliu
         */
        public class ArrowByLoad extends Sprite
        {
                private var _imgURL:String = "arrow-alt-right-black.png";
                private var _bitmap:Bitmap;
                public function ArrowByLoad()
                {
                        loadImg();
                }
                private function loadImg():void
                {
                        var loader:Loader = new Loader();
                        var request:URLRequest = new URLRequest(_imgURL);
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
                        loader.load(request);
                }
                private function loaded(e:Event):void
                {
                        _bitmap = e.target.content as Bitmap;
                        _bitmap.smoothing = true; //将Bitmap属性smoothing设为true后消除锯齿,默认为false
                        this.addChild(_bitmap);
                        _bitmap.x = -_bitmap.width/2;
                        _bitmap.y = -_bitmap.height/2;

                        dispatchEvent(e); //加载完成后发送事件,用于外部侦听事件,解决异步问题
                }
        }
}


这里使用外部加载的图像,如果在EaseToMouse.as初始化后直接设定ArrowByLoad类对象的scale值和alpha值,会发现并不能成功改变ArrowByLoad类对象的大小和透明度,因为EaseToMouse.as代码的执行和ArrowByLoad.as加载外部图像的代码执行为异步的,因此要在EaseToMouse内对加载完成事件进行监听才能成功改变scale值和alpha值。
当然,不加载外部图像,直接调用库中元件或者用[Embed]标签嵌入外部图像就不必要在EaseToMouse类中对加载行为进行监听了。
分享到:
评论

相关推荐

    as2.0 鼠标缓动跟随效果

    鼠标跟随效果 二级缓动效果 as2.0源代码

    Unity摄像机旋转缩放平移 自由视角跟随视角 带缓动

    自己写的已经非常完善了的摄像机脚本,挂在相机上赋个对象就可以直接用,多种视角多种效果,带缓动,代码开放可修改,注释齐全

    鼠标跟随动画

    4. **平滑过渡**:为了使动画更流畅,可以添加缓动效果。这可能需要用到`Storyboard`和`DoubleAnimation`来实现平滑的位移过渡。 5. **性能优化**:在大量元素跟随鼠标时,需要注意性能问题。可能需要使用`...

    flash鼠标跟随动画代码

    或者加入缓动函数,使跟随过程更平滑自然;还可以结合其他ActionScript功能,如颜色变化、大小缩放等,增加动画的视觉吸引力。 总的来说,掌握"flash鼠标跟随动画代码"不仅能让你熟练运用ActionScript,还能提升你...

    鼠标跟随任意形状窗口动画

    同时,为了保证动画的平滑性,开发者需要考虑帧率控制和适当的缓动函数,以避免出现卡顿或不自然的跳变。 在压缩包中的“鼠标跟随任意形状窗口动画”可能包含源代码示例、资源文件以及编译后的可执行文件。通过学习...

    Javascript 学习实例- 鼠标动态跟随

    在JavaScript学习过程中,"鼠标动态跟随"是一个基础但有趣的实践案例,它可以帮助开发者理解...或者引入缓动函数,使跟随效果更加自然。这都是提升用户体验的有效手段,并且能够锻炼开发者解决问题和优化代码的能力。

    鼠标跟随特效flash swf

    可能需要对代码进行调整以提高性能,减少不必要的计算,或者根据需求添加缓动函数,使动画更加流畅自然。 6. **发布SWF文件**:完成设计和编程后,导出为SWF格式,然后将其嵌入HTML页面中,用户就可以在网页上看到...

    WPF鼠标跟随效果,模仿flash

    - **缓动函数**:可以使用不同的缓动函数(EaseIn、EaseOut等)来调整动画的速度曲线,增强视觉效果。 - **响应式设计**:确保效果在不同分辨率和窗口大小下都能正常工作。 - **性能优化**:对于大量卡片,考虑使用...

    缓动DEMO(CanvasAnimate)

    在"背景 圆点跟随鼠标不规则缓动"的场景中,TweenLite被用来控制圆点的位置,使其根据鼠标移动的方向和速度,以平滑的路径进行移动,创造出一种不规则但又自然的动态效果。 Canvas API是HTML5提供的一种绘图工具,...

    可将任何HTML元素吸附到鼠标上制作鼠标跟随动画的js插件

    然而,实际的插件可能会更复杂,它可能包含对元素速度、延迟、缓动效果以及与其他元素或页面边缘的碰撞检测等功能。例如,为了平滑过渡,开发者可能会使用CSS3的`transition`属性,或者通过JavaScript实现自定义缓动...

    Flash线条动画 跟随鼠标改变角度.rar

    在Flash中,可以使用`tween`(缓动)技术来平滑地改变线条颜色。例如,可以创建一个颜色渐变动画,使线条在不同颜色之间平滑过渡。 6. **源文件分析**: "codesc.net"可能是压缩包内的源文件名,这可能是一个包含...

    Flash小球特效 跟随鼠标旋转.rar

    可以通过限制帧率或使用缓动函数来平滑旋转动画,提高用户体验。 8. **源码解析**: "codesc.net"可能是源代码所在的网站,但具体内容无法在此提供。通常,源码会包含创建小球对象、设置初始位置、添加鼠标事件...

    html5-whale_HTML网页动画鲨鱼_可跟随鼠标移动_whaleindex_

    此外,JavaScript还可以用于处理动画的帧率、缓动效果和碰撞检测等复杂逻辑,确保动画流畅且具有良好的用户体验。 CSS3也被广泛应用于HTML5动画中,尽管在这个特定的项目中可能不是主要部分。CSS3的transform和...

    html鼠标跟随移动的例子

    虽然在这个简单的鼠标跟随例子中,我们没有直接使用TweenMax,但在更复杂的场景下,比如缓动效果或时间轴控制,TweenMax能大大提升动画的质量。例如,我们可以用TweenMax将元素平滑地移动到鼠标位置: ```...

    jquery图片跟随鼠标晃动效果

    为了增加动态感,开发者可能还加入了缓动函数(如ease-out或ease-in-out),让图片移动更自然流畅。 同时,考虑到用户体验,开发者可能会设置一些限制,比如图片移动的最大距离,以防止图片过于剧烈晃动,导致视觉...

    炫酷的鼠标跟随

    为了优化用户体验,开发者还可能加入缓动函数(tweening),使跟随更平滑,或者设置边界限制,防止元素移出舞台。 总之,“炫酷的鼠标跟随”是ActionScript和Flash结合的精彩示例,展示了如何利用编程来增强用户的...

    flash鼠标跟随效果

    一个简单的鼠标跟随flash。用到了缓动效果。

    flash cs6鼠标跟随时间方块

    可以考虑使用缓动函数或时间差来平滑移动,减少不必要的计算。 7. **测试与调试**:在实现效果后,要进行充分的测试,确保在不同速度和方向下鼠标移动时,对象都能正确跟随。使用Flash的测试影片功能(`Control &gt; ...

    Silverlight 鼠标移动显示坐标 图片跟随

    此外,为了优化用户体验,我们可能需要添加一些额外的逻辑,比如限制图片移动范围、设置移动速度或者添加缓动效果等。这可以通过调整变换参数或者引入更复杂的动画机制来实现。 总结一下,实现“Silverlight 鼠标...

Global site tag (gtag.js) - Google Analytics