返回顶部
首页 > 资讯 > 精选 >Canvaskit快速入门实例代码分析
  • 144
分享到

Canvaskit快速入门实例代码分析

2023-07-05 12:07:48 144人浏览 薄情痞子
摘要

这篇“canvaskit快速入门实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Canvaskit快速入门实例代码

这篇“canvaskit快速入门实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Canvaskit快速入门实例代码分析”文章吧。

CanvasKit快速开始

CanvasKit 是一个 wasm 模块,它使用 Skia 去绘制画布元素,是一个比canvas api更高级的功能集。

一、最小应用

这个例子是一个最小的 Canvaskit 应用程序,它为一帧绘制一个圆角矩形。它从 unpkg.com 中提取 wasm 二进制文件,但您也可以自己构建和托管它。

<canvas id=foo width=300 height=300></canvas><script type="text/javascript"  src="https://unpkg.com/canvaskit-wasm@0.19.0/bin/canvaskit.js"></script><script type="text/javascript">    const ckLoaded = CanvasKitInit({    locateFile: (file) => 'Https://unpkg.com/canvaskit-wasm@0.19.0/bin/'+file});  ckLoaded.then((CanvasKit) => {    const surface = CanvasKit.MakeCanvasSurface('foo');      const paint = new CanvasKit.Paint();      paint.setColor(CanvasKit.Color4f(0.9, 0, 0, 1.0));      paint.setStyle(CanvasKit.PaintStyle.Stroke);      paint.setAntiAlias(true);      const rr = CanvasKit.RRectXY(CanvasKit.LTRBRect(10, 60, 210, 260), 25, 15);      function draw(canvas) {        canvas.clear(CanvasKit.WHITE);        canvas.drawRRect(rr, paint);      }      surface.drawOnce(draw);  });</script>

Canvaskit快速入门实例代码分析

二、代码解释

<canvas id=foo width=300 height=300></canvas>

创建 CanvasKit 将绘制到的画布。这个元素是我们控制绘图缓冲区的宽度和高度的地方,而它的 CSS 样式将控制在绘制到这些像素后应用的任何缩放。尽管使用了画布元素,CanvasKit 并没有调用 html 画布自己的绘制方法。它使用此画布元素获取 webGL2 上下文并使用编译为 WEBAssembly 的 c++ 代码执行大部分绘图工作,然后在每帧结束时向 GPU 发送命令。

<script type="text/javascript"  src="https://unpkg.com/canvaskit-wasm@0.19.0/bin/canvaskit.js"></script>
const ckLoaded = CanvasKitInit({locateFile: (file) => 'https://unpkg.com/canvaskit-wasm@0.19.0/bin/'+file});

加载canvaskit和wasm相关的二进制文件

CanvasKitInit接受一个函数参数,允许您更改它将尝试查找canvaskit.wasm的路径,该函数的返回值是一个promise,解析为加载的模块,通常将其命名为 CanvasKit。

const surface = CanvasKit.MakeCanvasSurface('foo');

创建一个与上面的 HTML canvas 元素关联的 Surface。但可以通过调用 MakeSWCanvasSurface 来覆盖。 MakeCanvasSurface 也是可以指定替代颜色空间或 gl 属性的地方。这个Surface会硬件加速

const paint = new CanvasKit.Paint();paint.setColor(CanvasKit.Color4f(0.9, 0, 0, 1.0));paint.setStyle(CanvasKit.PaintStyle.Stroke);paint.setAntiAlias(true);const rr = CanvasKit.RRectXY(CanvasKit.LTRBRect(10, 60, 210, 260), 25, 15);

创建绘画,描述如何在 canvaskit 中填充或描边矩形、路径、文本和其他几何图形。 rr 是一个圆角矩形,其角在 x 轴上的半径为 25像素,在 y 轴上的半径为 15 个像素。

function draw(canvas) {  canvas.clear(CanvasKit.WHITE);  canvas.drawRRect(rr, paint);}

定义一个函数来绘制。函数参数需要提供一个 Canvas 对象,我们可以在该对象上进行绘制调用。先清除画布再绘制圆角矩形。

我们还删除了 paint 对象。必须删除使用 new 创建的 CanvasKit 对象或以 make 为前缀的方法才能释放 wasm 内存。 Javascript 的 GC 不会自动处理它。 rr 只是一个数组,不是用 new 创建的,也没有指向任何 WASM 内存,所以我们不必对其调用 delete。

surface.drawOnce(draw);paint.delete()

将绘图函数交给 surface.drawOnce 进行调用并刷新表面。刷新后,Skia 将批处理并发送 WebGL 命令,使可见的变化出现在屏幕上。此示例绘制一次并处理表面,这就是一个一个canvaskit的最小应用程序。

三、基本绘制循环

如果我们需要每一帧都重绘到画布上怎么办?此示例像 90 年代的屏幕保护程序一样弹跳圆角矩形。

ckLoaded.then((CanvasKit) => {  const surface = CanvasKit.MakeCanvasSurface('foo');  const paint = new CanvasKit.Paint();  paint.setColor(CanvasKit.Color4f(0.9, 0, 0, 1.0));  paint.setStyle(CanvasKit.PaintStyle.Stroke);  paint.setAntiAlias(true);  // const rr = CanvasKit.RRectXY(CanvasKit.LTRBRect(10, 60, 210, 260), 25, 15);  const w = 100; // size of rect  const h = 60;  let x = 10; // initial position of top left corner.  let y = 60;  let dirX = 1; // box is always moving at a constant speed in one of the four diaGonal directions  let dirY = 1;  function drawFrame(canvas) {    // boundary check    if (x < 0 || x+w > 300) {      dirX *= -1; // reverse x direction when hitting side walls    }    if (y < 0 || y+h > 300) {      dirY *= -1; // reverse y direction when hitting top and bottom walls    }    // move    x += dirX;    y += dirY;    canvas.clear(CanvasKit.WHITE);    const rr = CanvasKit.RRectXY(CanvasKit.LTRBRect(x, y, x+w, y+h), 25, 15);    canvas.drawRRect(rr, paint);    surface.requestAnimationFrame(drawFrame);  }  surface.requestAnimationFrame(drawFrame);});

这里的主要区别是我们定义了一个在绘制每一帧之前要调用的函数,并将其传递给 surface.requestAnimationFrame(drawFrame);该回调被交给画布并处理冲洗。

创建一个函数作为我们的主要绘图循环。每次要渲染一帧(浏览器通常以 60fps 为目标)时,都会调用我们的函数,我们用白色清除画布,重新绘制圆形矩形,然后调用 surface.requestAnimationFrame(drawFrame) 注册要再次调用的函数在下一帧之前。

surface.requestAnimationFrame(drawFrame) 结合了 window.requestAnimationFrame 和 surface.flush() 并且应该以相同的方式使用。如果您的应用程序只会因鼠标事件而做出可见更改,请不要在 drawFrame 函数末尾调用 surface.requestAnimationFrame。仅在处理鼠标输入后调用它。

四、变形文本

CanvasKit 通过 HTML Canvas API 提供的最大功能之一是段落整形。要在您的应用程序中使用文本,请提供字体文件并在 CanvasKit 和字体文件准备就绪后使用 Promise.all 运行您的代码。

const loadFont = fetch('https://storage.googleapis.com/skia-cdn/misc/Roboto-Regular.ttf')  .then((response) => response.arrayBuffer());Promise.all([ckLoaded, loadFont]).then(([CanvasKit, robotoData]) => {  const surface = CanvasKit.MakeCanvasSurface('foo3');  const canvas = surface.getCanvas();  canvas.clear(CanvasKit.Color4f(0.9, 0.9, 0.9, 1.0));  const fontMgr = CanvasKit.FontMgr.FromData([robotoData]);  const paraStyle = new CanvasKit.ParagraphStyle({    textStyle: {      color: CanvasKit.BLACK,      fontFamilies: ['Roboto'],      fontSize: 28,    },    textAlign: CanvasKit.TextAlign.Left,  });  const text = 'Any sufficiently entrenched technology is indistinguishable from Javascript';  const builder = CanvasKit.ParagraphBuilder.Make(paraStyle, fontMgr);  builder.addText(text);  const paragraph = builder.build();  paragraph.layout(290); // width in pixels to use when wrapping text  canvas.drawParagraph(paragraph, 10, 10);  surface.flush();});
const fontMgr = CanvasKit.FontMgr.FromData([robotoData]);

创建一个对象,该对象按名称为 CanvasKit 中的各种文本工具提供字体。如果需要,您可以在此语句中加载多种字体。

const paraStyle = new CanvasKit.ParagraphStyle({  textStyle: {    color: CanvasKit.BLACK,    fontFamilies: ['Roboto'],    fontSize: 28,  },  textAlign: CanvasKit.TextAlign.Left,});

指定文本的样式。字体名称 Roboto 将用于从字体管理器中获取它。您可以指定 (color) 或 (foregroundColor and backgroundColor) 以突出显示。有关 API 的完整文档,请查看 npm 包的类型/子文件夹或 Skia 存储库中的 typescript 定义。

const builder = CanvasKit.ParagraphBuilder.Make(paraStyle, fontMgr);builder.addText(text);const paragraph = builder.build();

接下来,我们创建一个带有样式的 ParagraphBuilder,添加一些文本,并使用 build() 完成它。并且,我们可以在一个段落中使用多个 TextStyles

const builder = CanvasKit.ParagraphBuilder.Make(paraStyle, fontMgr);builder.addText(text1);const boldTextStyle = CanvasKit.TextStyle({    color: CanvasKit.BLACK,    fontFamilies: ['Roboto'],    fontSize: 28,    fontStyle: {'weight': CanvasKit.FontWeight.Bold},})builder.pushStyle(boldTextStyle);builder.addText(text2);builder.pop();builder.addText(text3);const paragraph = builder.build();

最后,我们对段落进行布局,将文本包装到特定宽度,然后将其绘制到画布上

paragraph.layout(290); // width in pixels to use when wrapping textcanvas.drawParagraph(paragraph, 10, 10); // (x, y) position of left top corner of paragraph.

以上就是关于“Canvaskit快速入门实例代码分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Canvaskit快速入门实例代码分析

本文链接: https://lsjlt.com/news/351729.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Canvaskit快速入门实例代码分析
    这篇“Canvaskit快速入门实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Canvaskit快速入门实例代码...
    99+
    2023-07-05
  • Python快速入门实例代码分析
    这篇文章主要介绍了Python快速入门实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python快速入门实例代码分析文章都会有所收获,下面我们一起来看看吧。Python 安装已经安装软件的小伙伴要检...
    99+
    2023-07-05
  • python入门代码实例分析
    这篇文章主要介绍“python入门代码实例分析”,在日常操作中,相信很多人在python入门代码实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python入门代码实例...
    99+
    2024-04-02
  • javascript入门实例代码分析
    这篇文章主要介绍“javascript入门实例代码分析”,在日常操作中,相信很多人在javascript入门实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java...
    99+
    2024-04-02
  • Rollup入门实例代码分析
    这篇文章主要介绍了Rollup入门实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Rollup入门实例代码分析文章都会有所收获,下面我们一起来看看吧。Rollup介绍及使用1、Rollup 概述仅仅是...
    99+
    2023-07-05
  • FluentMybatis快速入门的示例分析
    这篇文章主要介绍FluentMybatis快速入门的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql...
    99+
    2023-06-20
  • Linux系统快速入门的示例分析
    Linux系统快速入门的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我...
    99+
    2023-06-05
  • PHP编程快速入门的示例分析
    这篇文章将为大家详细讲解有关PHP编程快速入门的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。面向对象编程(OOP)是我们编程的一项基本技能,PHP4对OOP提供了良好的支持。如何使用OOP的思想...
    99+
    2023-06-17
  • Druid入门(1)—— 快速入门实时分析利器-Druid_0.17
    一、安装准备 本次安装的版本是截止2020.1.30最新的版本0.17.0 软件要求 需要Java 8(8u92 +)以上的版本,否则会有问题 Linux,Mac OS X或其他类似Unix的操作系统(不支持Windows) ...
    99+
    2019-09-20
    Druid入门(1)—— 快速入门实时分析利器-Druid_0.17
  • mysql数据库快速入门的示例分析
    这篇文章主要介绍mysql数据库快速入门的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如何启动MySQL服务?对于如何启动MySQL服务?除了可以在安装的时候勾选随着开机自...
    99+
    2024-04-02
  • 快速入门 Python 数据分析实用指
    Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一。那么作为一个新手小白,该如何快速入门 Python 数据分析呢? 下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习指南。 数据分析一般工作流程如下: ...
    99+
    2023-01-31
    入门 快速 数据
  • PHP数组用法详解:快速入门与实例分析
    PHP 数组是一种非常强大且灵活的数据结构,可以存储多个值并按照索引或键进行访问。在 PHP 中,数组的使用非常普遍,因此掌握数组的用法是非常重要的。本文将从快速入门开始,介绍 PHP...
    99+
    2024-03-14
    php 数组 实例 键值对
  • Python数据类型入门实例代码分析
    本文小编为大家详细介绍“Python数据类型入门实例代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python数据类型入门实例代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学...
    99+
    2024-04-02
  • PHP反序列化入门代码实例分析
    本文小编为大家详细介绍“PHP反序列化入门代码实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP反序列化入门代码实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。php反序列化简单理解首先我们需要...
    99+
    2023-07-05
  • vue组合式API入门实例代码分析
    这篇文章主要讲解了“vue组合式API入门实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue组合式API入门实例代码分析”吧!组合式API在vue3.0发布的时候,组合式API...
    99+
    2023-07-05
  • react-router-dom路由入门实例代码分析
    这篇文章主要介绍了react-router-dom路由入门实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇react-router-dom路由入门实例代码分析文章都会有所收获,下面我们一起来看看吧。r...
    99+
    2023-07-05
  • Python爬虫技术入门实例代码分析
    这篇“Python爬虫技术入门实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python爬虫技术入门实例代码分析...
    99+
    2023-07-05
  • SpringBoot整合minio快速入门教程(代码示例)
    分享一个快速使用springboot整合minio实现文件上传和下载的示例。前提是已经安装并运行minio服务,参考 minio快速入门文档 首先添加Minio的依赖 <dep...
    99+
    2024-04-02
  • MyBatis框架零基础快速入门案例分析
    这篇文章主要讲解了“MyBatis框架零基础快速入门案例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MyBatis框架零基础快速入门案例分析”吧!一、创建数据库和表数据库名ssm,数据...
    99+
    2023-06-29
  • Java注解入门案例代码分析
    这篇文章主要介绍“Java注解入门案例代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java注解入门案例代码分析”文章能帮助大家解决问题。Talk is cheap, show me the...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作