首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HTML5 Canvas开发详解(7) -- 高级动画

1.1 捕获物体 1.1.1 矩形的捕获 可以通过获取鼠标点击时的坐标来判断是否捕获了矩形。...,如果落在,就添加两个事件(mousemove和mouseup); 2)移动物体:在鼠标移动(mousemove)中,更新物体坐标为鼠标坐标; 3)松开物体:在鼠标松开(mouseup)时,移除mouseup...以小球来说,我们用oldX和oldY分别表示小球旧的位置坐标,新的位置坐标是ball.x和ball.y,可以得到: vx = ball.x - oldX; vy = ball.y - oldY; 示例:...语法: //targetX、targetY:表示目标的横坐标和纵坐标 //easing:表示缓动系数 //vx、vy:表示物体在x轴方向和y轴方向上的速度 let targetX = 任意位置; let...不管缓动动画应用于哪些方面,其实现思路是一样的,主要是以下两个步骤: 1)当前速度 = (最终值 - 当前值)* 缓动系数; 2)新的值 = 当前值 + 当前速度。

99030
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    「JavaScript 」动画基础 - 01

    = 'x坐标是' + x + ' y坐标是' + y; }) 1.1.4 案例:模态框拖拽 弹出框,我们也称为模态框。...触发事件是鼠标按下mousedown,鼠标移动mousemove 鼠标松开 mouseup 拖拽过程: 鼠标移动过程中,获得最新的值赋值给模态框的left和top值,这样模态框可以跟着鼠标走了 鼠标按下触发的事件源是最上面一行...left和top值 document.addEventListener('mousemove', move) function move(e) { // 注意单位‘px...案例分析: 黄色的遮挡层跟随鼠标功能。 把鼠标坐标给遮挡层不合适。因为遮挡层坐标以父盒子为准。 首先是获得鼠标在盒子的坐标。 之后把数值给遮挡层做为left 和top值。...,激发响应事件 imgBox.addEventListener('mousemove', function() { // x,y为鼠标在大盒子中的相对坐标位置 var

    50910

    Canvas系列(15):实战-小球拖拽

    接下来就是需要获取鼠标的x和y坐标了,这里就监听mousemove事件来获取。...; return true; } }) }, false); 我们定义了一个captureMouse的方法,它返回一个对象mouse,只要在任何地方使用mouse.x和mouse.y...canvas.removeEventListener('mouseup', onMouseUp, false); } }, false); 现在还有一个问题,就是当小球拖拽的时候,不应该再受到重力和自己的速度运动了...,所以需要修改animate函数,只有当选中的小球和当前遍历的小球不相等的时候才去更新新的坐标,否则就用鼠标的坐标(上述代码也实现): function animate (){ requestAnimationFrame...投掷 我们刚才拖拽完了以后,由于速度设为了0,所以小球是做自由落体运动,而大多数情况下,我们更希望可以把小球投掷出去,那么当小球投掷的时候,需要计算小球的瞬时速度,这时我们就需要定义拖拽时上一次小球的坐标

    91132

    FlashFlex学习笔记(38):缓动动画

    ,速度跟距离成反比关系,用公式描述为 V = k S  (0时,逐渐慢下来,直到准确停在指定位置...* easing; //x轴速度与距离成正比缩小 var vy:Number = (targetY - ball.y) * easing; //y轴速度与距离成正比缩小 ball.x...这样的话,假设物体要移动到 100的x坐标位置,当前已经到了99.95,根据比例因子0.5的设置,下一次应该移动 (100 - 99.95)/2 = 0.025,这个值已经超出了Flash的处理能力,系统会把...,合理的做法是达到一定的精度值时,就可以认为已经移动完成,从而做出相应的处理....,这样出发时,其实就很接近下面要演示的缓动鼠标跟随 代码: package { import flash.display.Sprite; import flash.events.MouseEvent

    58950

    FlashFlex学习笔记(39):弹性运动

    ,但加速度越来越小,等经过目标点时,发现速度太大刹不住车(此时速度达到最大值,但加速度减为0),奔过头了!...于是加速度发生逆转,从0开始变为负值,从而导致速度越来越小,等速度减到0时,也奔到了最右侧(此时负加速度也达到最大值),然后在负加速度的影响下,开始掉头又狂奔....这样不断下去,直接摩擦力让它筋疲力尽...ball.x+=vx; } } } 上面演示是一维的弹性运动,当然也可以同时在x轴和y轴上进行 代码: package { import flash.display.Sprite; import...,而第二个示例可以看作是x,y二个方向加速度随位移影响的叠加,而第三个示例,则可以看作是任何方向这种影响再叠加重力的综合效果。...); handle.x=Math.random()*stage.stageWidth; handle.y=Math.random()*stage.stageHeight; handle.addEventListener

    63650

    前端成神之路-WebAPIs05

    = 'x坐标是' + x + ' y坐标是' + y; }) 1.1.4 案例:模态框拖拽 弹出框,我们也称为模态框。 ​...触发事件是鼠标按下mousedown,鼠标移动mousemove 鼠标松开 mouseup 拖拽过程: 鼠标移动过程中,获得最新的值赋值给模态框的left和top值,这样模态框可以跟着鼠标走了 鼠标按下触发的事件源是最上面一行...// (2) 鼠标移动的时候,把鼠标在页面中的坐标,减去 鼠标在盒子内的坐标就是模态框的left和top值 document.addEventListener('mousemove...案例分析: 黄色的遮挡层跟随鼠标功能。 把鼠标坐标给遮挡层不合适。因为遮挡层坐标以父盒子为准。 首先是获得鼠标在盒子的坐标。 之后把数值给遮挡层做为left 和top值。...// console.log(x, y); // (2) 减去盒子高度 300的一半 是 150 就是我们mask 的最终 left 和top值了 // (3) 我们mask

    1.5K10

    FlashFlex学习笔记(24):粒子效果

    y轴的速度,其它没变 原理:在舞台的某一区域放置大量小球实例,然后在某个时刻让其向四面八方运动即可(即改变每个小球在x,y轴上的坐标) 问题:效率!...让CPU在每帧对于大量对象进行重绘是很耗资源的,所以当小球跑出舞台边界时,得想办法通知CPU:这些小球不需要再处理了(反正也看不见)!....y=mouseY+15; } function MouseDownHandler(e:MouseEvent):void { //点击一次后,取消鼠标跟随,并移除lbl1,同时也取消鼠标点击事件(即本事件仅触发一次...原理:将所有粒子聚集于屏幕上某点(本例中为屏幕底部中心点),然后赋给一个随机向上的速度(这样就能向上喷射出),同时为了更效果更自然,还要加入随机的x轴方向速度(以实现喷射过程中的扩散),最后再加入重力加速度...效率:为了能最大限度的利用现有对象,当粒子跑出舞台边界时,重新用代码将其定位到发射点,以便下次继续喷射。 交互:本例中为增强交互性,用鼠标的x轴位置模拟了风力影响。

    66450

    FlashFlex学习笔记(31):对象拖拽与投掷

    frictionX; //加入摩擦力,所以最终会停下来 vy *= frictionY; ball.x+=vx;//产生移动 ball.y+=vy; var left:...而投掷则意味着:在鼠标松开小球的那一瞬间,小球也应该具备有一定的出口速度(即鼠标最终的移动速度)。...Flash中每一帧对应的时间基本上是相同的,可以认为这就是物理中的“单位时间”,根据刚才对投掷概念的理解,只要代码能得知在鼠标松开小球的最后一帧,小球在x,y轴方向的位移,即为小球的出口x,y轴速度....private function MouseDownHandler(event:MouseEvent):void { oldX = ball.x; oldY = ball.y;...跟踪每一帧小球的速度(坐标位置) private function TrackVelocity(event:Event):void { vx = ball.x-oldX; vy = ball.y-oldY

    67390

    js鼠标事件 clientX、clientY、offsetX、offsetY、layerX、layerY、pageX、 pageY、screenX、screenY「建议收藏」

    区别:mouseover和mouseout子元素也会触发,可以冒泡触发 区别:mouseenter和mouseleave是针对侦听的对象触发,阻止了冒泡 阻止鼠标的默认事件 e.preventDefault...左键对应的值为 0、1、1 中键对应的值为 1、4、2 右键对应的值为 2、2、3 timeStamp 从页面打开开始到触发事件的时间 以下内容为坐标值的说明: clientX和clientY与...x,y clientX和clientY与x,y一样的,都是客户区域坐标,指鼠标的坐标,以浏览器显示区域的左上角开始,x,y是新浏览器支持 以下截图打印的结果都是div2元素的左上顶点(从边框开始)的位置坐标...相对页面左上角的距离 screenX screenY screenX screenY 相对屏幕左上角的位置 总结: clientX和clientY与x,y一样的,以浏览器显示区域的左上角开始...x,y是新浏览器支持 offsetX,offsetY,针对目标元素的左上角坐标,从padding开始。

    3K20

    基于发布-订阅的原生 JS 插件封装

    一、需求分析 封装一个插件,将小球的 DOM 对象作为参数传入,使得小球在鼠标按下和放开后能够运动,在水平方向做匀减速直线运动,初速度为鼠标移开瞬间的速度,在竖直方向的运动类似于自由落体运动。...二、梳理思路 分析这样的一个过程,其中大致会经历一下的关键步骤: 1、鼠标按下时,记录小球的初始位置信息 2、鼠标按下后滑动,记录松开鼠标瞬间的移动速度 3、鼠标松开后,在水平方向上,让小球根据刚刚记录的移动速度进行匀减速运动...同样,对实现加速度的效果,首先弄清一个问题,什么是速度?速度就是单位时间内运动的距离,这里暂且把它当做 20ms 内的距离,那么我每次拍照时,将这个距离增加或减少一个值,这个值就是加速度。...//开辟一个容器let $plan = $.callBack();//往容器里面添加函数$plan.add(function(x, y){ console.log(x, y);})$plan.add...(function(x, y){ console.log(y, x);})$plan.fire(10, 20);//会输出10,20 20,10//$plan.remove(function)用来从容器中删除某个函数

    3.1K20

    手写原生代码专题 | 简易手写画板(二)

    具体的思路如下: 定义DOM对象变量:获取画布、增减线条粗细的按钮、颜色控件、显示线条粗细值、清除按钮 然后定义一些变量值:初始化线条粗细的长度、鼠标是否按下的状态、线条颜色的默认值、颜色变量、鼠标的位置...x,y 变量 然后我们定义画圆形、画直线的相关方法:drawCircle(x,y)、drawLine(x1,y1,x2,y2) 接着在画布上定义监听 mousedown 的方法,初始化鼠标位置的X,Y的值...,更改鼠标是否按下的状态值为true。...x,y值,先以线条的宽度绘制圆形,然后以鼠标按下时的 x,y 的值为直线的起点,鼠标移动时获取鼠标的 x,y 值为终点绘制直线。...绘制完成后更改x,y的值为当前鼠标的位置(不断更新直线的起点),这样就可以一直拖动鼠标绘制直线。

    1.5K20
    领券