如何用 Canvas 绘制曲线动画?

2024-03-22

我有很多点想慢慢画出来。我尝试 setTimeOut 以及由此产生的效果tutorial http://www.html5canvastutorials.com/advanced/html5-canvas-linear-motion-animation/。但没有取得如此大的成功。

该函数看起来像这样

功能:

var myFunction = function(ctx, grid, points) {
                ctx.beginPath();
                ctx.moveTo(points[0].x, points[0].y);
                ctx.lineWidth = 2;
                ctx.strokeStyle = '#2068A8';
                ctx.fillStyle = '#2068A8';
                var count = 1;
                for (count = 1; count < points.length; count++) {
                    ctx.lineTo(points[count].x , points[count].y);
                }
                ctx.stroke();
            }

围绕这个函数还有许多其他绘图函数,但我只想为其中一个绘制动画。

如何用canvas慢慢绘制函数?


有两种方法可以做到这一点,我可以立即想到。一个基本上是绘制一个点并在绘制另一个点之前暂停一定的时间。这是我提供的第一个示例。第二种方法涉及将部分线条绘制到当前目标,这会提供更平滑的绘图外观。作为旁注我使用requestAnimationFrame https://developer.mozilla.org/en-US/docs/DOM/window.requestAnimationFrame在这两个示例中,推荐使用它来执行任何类型的画布动画。

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d");

canvas.width = 400;
canvas.height = 200;

var points = [],
    currentPoint = 1,
    nextTime = new Date().getTime()+500,
    pace = 200;

// make some points
for (var i = 0; i < 50; i++) {
    points.push({
        x: i * (canvas.width/50),
        y: 100+Math.sin(i) * 10
    });
}

function draw() {

    if(new Date().getTime() > nextTime){
        nextTime = new Date().getTime() + pace;

        currentPoint++;
        if(currentPoint > points.length){
            currentPoint = 0;
        }
    }
    ctx.clearRect(0,0,canvas.width, canvas.height);
    ctx.beginPath();
    ctx.moveTo(points[0].x, points[0].y);
    ctx.lineWidth = 2;
    ctx.strokeStyle = '#2068A8';
    ctx.fillStyle = '#2068A8';
    for (var p = 1, plen = currentPoint; p < plen; p++) {
        ctx.lineTo(points[p].x, points[p].y);
    }
    ctx.stroke();

    requestAnimFrame(draw);
}

draw();

现场演示 http://jsfiddle.net/ksgk3/1

如果您发现有点不稳定,可以执行以下操作来绘制更平滑的线条

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d");

canvas.width = 400;
canvas.height = 200;

var points = [],
    currentPoint = 1,
    speed = 2,
    targetX = 0,
    targetY = 0,
    x = 0,
    y = 0;

// make some points
for (var i = 0; i < 50; i++) {
    points.push({
        x: i * (canvas.width/50),
        y: 100+Math.sin(i) * 10
    });
}

// set the initial target and starting point
targetX = points[1].x;
targetY = points[1].y;
x = points[0].x;
y = points[0].y;

function draw() {
    var tx = targetX - x,
        ty = targetY - y,
        dist = Math.sqrt(tx*tx+ty*ty),
        velX = (tx/dist)*speed,
        velY = (ty/dist)*speed;

        x += velX
        y += velY;

    if(dist < 1){
        currentPoint++;

        if(currentPoint >= points.length){
            currentPoint = 1;
            x = points[0].x;
            y = points[0].y;
        }

        targetX = points[currentPoint].x;
        targetY = points[currentPoint].y;
    }

    ctx.clearRect(0,0,canvas.width, canvas.height);
    ctx.beginPath();
    ctx.moveTo(points[0].x, points[0].y);
    ctx.lineWidth = 2;
    ctx.strokeStyle = '#2068A8';
    ctx.fillStyle = '#2068A8';

    for (var p = 0, plen = currentPoint-1; p < plen; p++) {
        ctx.lineTo(points[p].x, points[p].y);
    }
    ctx.lineTo(x, y);    
    ctx.stroke();

    requestAnimFrame(draw);
}

draw();

现场演示 http://jsfiddle.net/loktar/LKSGL/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 Canvas 绘制曲线动画? 的相关文章

  • 如何解释这个正则表达式 /[\W_]/g

    我的代码是 var result2 result replace W g replace replace 该代码有效 我得到了我需要完成的工作 但我不明白正则表达式如何 W g有效 但我找不到任何我理解的文档 g这是一个全局正则表达式 因此
  • Ace Editor 获取当前选定的行号和文本

    我目前正在使用 Ace Editor 但我在文档中找不到与检索当前所选行号及其文本相关的任何内容 有任何想法吗 首先 定义 选定行 ace 中的选择可以跨多行设置 如果您的意思是 未设置选择 当前行是光标闪烁的行 var currline
  • GWT 与 ScriptSharp 的优缺点 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • “Backbone.js 视图”中的单击事件不起作用

    我尝试开始使用backbone js 但我发现当我不使用 body 作为视图的el时 该事件不起作用 这是代码 您可以将其另存为 html 文件并运行
  • 使用 JavaScript 访问 Jekyll 变量并通过 DOM 操作传递它

    我很可能有错误逻辑 但我刚刚学习 JavaScript 和 Jekyll 我的目标是通过 JavaScript 操作 HTML 元素 并将一些 Jekyll 变量放置在该元素的内部 HTML 中 一切都从本地开发目录加载jekyll ser
  • 如何获得日期为 yyyy-mm-dd 的年份差异?

    我想得到以 yyyy mm dd 格式给出的两个日期之间的差异 差异应该是年份 var ds 2002 09 23 var today date new Date alert today date Date prototype yyyymm
  • 在 Javascript 中获取类的所有实例

    我以为这个问题已经有了答案 但我似乎找不到答案 如何在 Javascript 中的此类的所有实例上运行特定的类方法 这必须在我不知道实例名称的情况下完成 我想我可以在类中使用某种静态变量来存储所有实例 但这在 JS 中似乎不存在 那么如何在
  • Javascript Replace() 仅替换第一个匹配项[重复]

    这个问题已经存在了 你好 请参阅这里的 jsfiddle http jsfiddle net moolood jU9QY http jsfiddle net moolood jU9QY var toto bien address 1 bie
  • 分层边缘捆绑:添加父组标签

    我对 HTML 和 JavaScript 还很陌生 我面临着著名的分层边缘捆绑可用here https bl ocks org mbostock 7607999 由 D3 js 库生成 My goal is to add a semi ci
  • AJV自定义关键字验证

    我正在使用 AJV 库来验证我的 JSON 架构 我希望能够验证Startdate成为一个字符串 如果不是字符串 则应将其转换为N A 目前 它仅转换undefined to N A 但是 在这些情况下 它不会按预期工作 null gt 空
  • 如何在android中使用webview明智地显示Html内容页面?

    您好 我创建了一个简单的应用程序来在 webview 中显示 html 页面 我使用 webview 并显示页面加载时间 如下所示 此后禁用滚动并使用下一个和上一个按钮来后退和前进包含 所以我的代码如下 首先onCreate显示添加webv
  • 动态创建多个上传文件

    我想知道是否有人知道动态创建上传表单的最佳方法 这就是我想要实现的目标 下面显示的代码允许一次上传 我想要一个按钮 按下该按钮后 应添加另一种形式用于文件上传 因此 如果我想上传 假设有 7 个文件 我想按按钮 7 次来创建这些上传表单 每
  • 通过 AJAX 加载 Google Maps API,控制台错误

    我正在使用 jquery javascript ajax 和 php 构建一个完全动态的网站 当我单击导航链接时 浏览器会使用 ajax 打开该页面 所以基本上所有页面都加载在同一个index php 中 如果我转到 位置 选项卡 其中有谷
  • 将数组中的项目移动到最后一个位置

    我有一系列对象 我想将选定的对象移动到数组中的最后一个位置 我如何在 javascript 或 jquery 中执行此操作 这是我的一些代码 var sortedProductRow this product row for var s i
  • 在 AngularJS 中使用 iFrame

    Using Angular 1 2 我正在尝试找出一种 有角度 的方式来加载 iFrame 但我在任何地方都找不到任何教程 任何真正的讨论 基本上 我有一个显示链接列表的搜索页面 单击链接应调用控制器中的一个函数 该函数将数据 可能通过 h
  • FB.logout() - 无访问令牌 - “以不同用户身份登录”

    这个问题与这个问题相关 在没有访问令牌的情况下调用 FB logout https stackoverflow com questions 8430474 fb logout called without an access token 1
  • 在dynamodb中使用batchWriteItem

    我的 dynamo 数据库中有两个表 一个是候选表 另一个是用户表我想在 dynamo 数据库中使用 batchWriteItem 以便在表中添加数据 我格式化的查询如下 var user userid usrid role candida
  • 使用 v-bind Vue.js 的多个变量

    我试图在以下代码中传递多个变量 div div 但我收到以下错误 Vue warn 无法生成渲染函数 SyntaxError 意外的标记 在 我尝试更换 with a 但我得到 Vue warn 无法生成渲染函数 SyntaxError I
  • 视频作为网站背景? HTML 5

    我想使用视频作为背景 而不是自动拉伸到整个屏幕 背景 的图像 我还想旋转视频和图像 以便以任何顺序显示随机视频 图像 如果知道如何延迟视频播放 以便视频在网站加载后 30 秒只播放一次 那就太好了 thx 看看我的 jquery video
  • 如何使用 Playwright 打开新选项卡(例如,单击按钮在新选项卡中打开新部分)

    我正在寻找针对当前情况的更简单的解决方案 例如 您打开 google 任何其他网站 并且希望通过单击按钮 例如 Gmail 使用 Playwright 在新选项卡中打开此页面 let browser page context describ

随机推荐

  • AnimationCurve.Evaluate - 按值获取时间

    有没有一种内置方法如何从 Unity3d 中的动画曲线中获取时间值 与Evaluate相反的方式 我需要实现这一目标 而不是从时间中获取价值 float time AnimationCurve Evaluate float value 一般
  • R update() 交互项未删除

    问题 我打算用交互项拟合线性模型 在估计 完整 模型后 我想删除不重要的交互项 但是 在我的模型上使用函数 update lm interaction 后 没有任何反应 请帮忙 Data library car data Prestige
  • 使用 OpenCV 输出作为网络摄像头 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 所以 我想编写一个程序 使 OpenCV 处理后的输出被视为网络摄像头 我想用它为 Skype 等程序创
  • 重命名导入的静态函数有什么问题?

    考虑以下 Scala 代码 object MainObject def main args Array String import Integer parseInt gt atoi println atoi 5 2 println args
  • 如何在流式传输之前知道音频歌曲的持续时间?

    我正在制作一个流音频歌曲的应用程序 在自定义媒体播放器中 我必须显示该音频文件的总持续时间 如果一首音频歌曲是 SDCard 我可以使用以下方法知道它的持续时间 MediaPlayer player public double durati
  • MySQL - 如何插入具有多对多关系的表

    我有一桌人 每个人都拥有一项财产 并且许多人可能拥有某种财产 所以这是一个多对多的关系 这是架构 CREATE TABLE persons person id int 11 NOT NULL AUTO INCREMENT firstname
  • 有没有办法告诉 html 元素忽略任何样式表?

    我正在尝试向已经具有全局 选择 样式的页面添加下拉菜单 有没有办法告诉新的选择列表忽略全局样式 大约有 1 到 2 个使用全局样式的现有下拉菜单 所以我不想重构现有的 html 假设您可以在该元素上设置唯一的类或 id 您可以使用 有限的浏
  • R 3.5 中的 data.table 包未安装

    我目前正在使用 R 3 5 测试版 我的项目中需要 data table 包 但我的包未安装 任何人都可以帮我解决这个问题吗 当我安装它时 它向我显示以下错误 install packages 数据 表 将软件包安装到 C Users hp
  • Windows Mobile 同步错误

    我是 Windows Mobile 开发新手 一直在研究在 PDA 运行的 WM6 和 SQL Server 2005 数据库之间同步数据的方法 经过一番研究后 我决定使用 Windows 同步服务 我首先查看示例 SyncServices
  • 检查一个名字是否看起来“人类”?

    我有一款在线角色扮演游戏 我正在认真对待 最近 我遇到了用户使用虚假名称 只是一堆不同字母 制作虚假字符的问题 就像 Ghytjrhfsdjfnsdms Yiiiedawdmnwe Hhhhhhhhhhejejekk 我强迫他们改名 但这已
  • 使用“json.dumps”时 JSON 对象中的项目乱序?

    我在用着json dumps转换成json就像 countries append id row id name row name timezone row timezone print json dumps countries 我得到的结果
  • 禁用 EclipseLink 缓存

    在我的应用程序中 当用户登录系统时 系统从数据库读取一些设置并将它们存储在用户的会话中 系统使用 EclipseLink JPA 2 0 通过 JPA 查询执行此操作 当我更改数据库中的某些设置并再次登录时 查询将返回以前的结果 Eclip
  • 定期调用 Android 服务 [GoodApporach?]

    我的要求是 Android 应用程序必须每隔一小时 可配置 向服务器发送用户位置详细信息 纬度和经度 我遵循的方法是使用警报管理器 我以配置的时间间隔调用我的服务 无论应用程序是否正在运行 该服务都会将位置详细信息发送到服务器 这是一个好方
  • URLWithString 对于资源路径返回 nil - iphone

    由于某种原因获取资源的 URL 时出现问题 此代码位于 viewDidLoad 中 并且可以在其他应用程序中使用 但由于某种原因不能在此处使用 NSString audioString NSBundle mainBundle pathFor
  • 升级到 Xcode 5.0.2:xib 警告。属性不可用

    我最近升级到了 xcode 5 0 2 现在 当我构建 Cocoa 应用程序时 我收到此警告 属性不可用 在 10 8 之前的 Mac OS X 版本上使用当前宽度作为最大布局宽度 我尝试找到 最大布局宽度 但无法找到 我该如何摆脱这个警告
  • ES6的导出和花括号

    我看到聊天频道中发布了一段代码 他的代码的最后是 export UserInformation 有些团体表示语法错误 有人说只要变量存在就可以 那么哪一组是正确的呢 我也是第一次见到这种语法 我在导出时从未见过花括号 我只在导入时使用过它们
  • 使用 PHP 测试 FTP 连接

    我正在使用下面的 PHP 脚本来测试 FTP 连接 目前 如果连接成功 它正在打印文件数组 如果能够连接 如何让它也显示消息 就像 连接成功 一样 con ftp connect server or die Couldn t connect
  • 如何将 facebook 测试页面订阅到 facebook apps webhook

    我正在创建聊天机器人并想在 Facebook 上建立联系 我想在我的页面中测试我的信使聊天机器人 但我必须首先进行应用程序审查和业务验证 但我不想这样做 因为我刚刚开发了我的聊天机器人 或者你可以说这是暂存环境 I found that w
  • Python:将参数传递给 threading.Thread 实例的正确方法是什么

    我扩展了 threading Thread 我的想法是做这样的事情 class StateManager threading Thread def run self lock state while True lock acquire se
  • 如何用 Canvas 绘制曲线动画?

    我有很多点想慢慢画出来 我尝试 setTimeOut 以及由此产生的效果tutorial http www html5canvastutorials com advanced html5 canvas linear motion anima