
#HarmonyOS NEXT体验官# 基于鸿蒙Next的App(创意工坊)解析6:如何将SVG插入到画布中 原创
本文会详细介绍如何将矢量图(SVG)插入画布,矢量图需要被编码为base64,然后直接保存到js代码中。如显示动物列表的js代码如下图所示:
每一个svg是一个数组元素。最终的SVG显示界面如下图所示。
这个界面是使用InsertImages组件实现的。。
InsertImages类实现的详细解释与注释
代码解释
这段代码实现了一个用于选择图像的组件 InsertImages
。该组件由一组按钮和一个Webview组成,按钮用于选择不同的图像类别,Webview用于显示图像列表。用户可以点击按钮从不同的图像类别中选择图像,并将选择的结果通过回调函数返回。
详细代码注释
代码的原理和实现过程
这个组件的主要功能是提供一个界面,让用户可以从多个预定义的图像类别中选择图像,并且通过与Webview的交互来展示不同类别的图像列表。
-
组件的结构:
- 使用ArkTS的UI组件(如
Column
、Row
、Button
等)来构建界面,包含一系列按钮和一个Webview。 - 每个按钮对应不同的图像类别,点击按钮时,通过
WebviewController
来执行JavaScript代码,以更新Webview中的图像列表。
- 使用ArkTS的UI组件(如
-
事件处理:
- 使用
onClick
事件处理按钮点击,当用户点击某个类别按钮时,WebviewController
会运行对应的JavaScript函数,更新Webview中的内容。 - 通过
imageSelected
和imageListClosed
这两个可选的回调函数,组件可以在外部处理图像选择和列表关闭的逻辑。
- 使用
-
Webview交互:
WebviewController
的runJavaScript
方法用于在Webview中执行JavaScript代码,组件通过这种方式与Webview进行通信。
-
UI设计:
- 界面布局通过多个
Column
和Row
组件实现,按钮的样式和布局使用了ArkTS的样式属性(如borderRadius
、backgroundColor
、margin
等)。 - Webview组件显示图像列表的HTML页面,页面路径通过
src
属性指定。
- 界面布局通过多个
这段代码展示了如何在ArkTS中构建一个复杂的UI组件,并结合Webview进行灵活的内容展示与交互。
在选择svg时,会调用imageSelected事件函数,该函数的代码如下:
在上面的代码中,调用了用js实现的addSVGImage函数,这个函数是根据svg图像的索引将svg图像插入到画布中,代码如下:
上面的代码使用了loadSVGFromString函数装载SVG图像,下面是对这个函数的详细解释。
fabric.loadSVGFromString
函数的原型和用法详解
fabric.loadSVGFromString
是 Fabric.js
库中用于从 SVG 字符串加载 SVG 图像的函数。Fabric.js 是一个强大的 JavaScript 库,用于在 HTML5 Canvas 上轻松绘制复杂的矢量图形和图片。
原型
参数解释
-
svgString: string
- 描述: SVG 图像的字符串形式。这个字符串包含了完整的 SVG 定义,例如
<svg>
标签及其内容。 - 类型:
string
- 示例:
- 描述: SVG 图像的字符串形式。这个字符串包含了完整的 SVG 定义,例如
-
callback: (objects: fabric.Object[], options: object) => void
- 描述: 一个回调函数,在 SVG 解析完成后调用。这个回调函数接收两个参数:
objects
: Fabric.js 对象数组,每个对象代表解析后的 SVG 元素(例如,fabric.Circle
,fabric.Rect
等)。options
: 包含一些额外的选项,如 SVG 的width
和height
。
- 类型:
function
- 示例:
- 描述: 一个回调函数,在 SVG 解析完成后调用。这个回调函数接收两个参数:
-
reviver: (element: SVGElement, object: fabric.Object) => void (可选)
- 描述: 一个可选的“复活器”函数,它在每个 SVG 元素被解析成
fabric.Object
对象之前调用。通过这个函数,你可以自定义每个对象的属性或行为。 - 类型:
function
- 示例:
- 描述: 一个可选的“复活器”函数,它在每个 SVG 元素被解析成
返回值
- 返回值类型:
void
- 描述: 该函数没有返回值,而是通过回调函数来处理解析后的对象和选项。
用法示例
以下是一个完整的例子,演示如何使用 fabric.loadSVGFromString
加载 SVG 字符串,并将其添加到 Fabric.js 的画布中。
详细说明
- SVG 解析:
fabric.loadSVGFromString
函数内部使用浏览器的原生 SVG 解析能力,解析传入的 SVG 字符串,并将其转化为 Fabric.js 可以理解的对象模型。 - 异步操作: 这个函数是异步的,它不会立即返回解析结果,而是在完成解析后调用提供的回调函数。这意味着在解析过程中,主线程不会被阻塞,确保应用程序的响应性。
- 对象创建: 解析后的 SVG 元素被转化为 Fabric.js 的对象,如
fabric.Circle
,fabric.Rect
,fabric.Path
等。这些对象可以像其他 Fabric.js 对象一样进行操作和管理。 - 组管理: 解析出的对象通常会被分组(使用
fabric.Group
),这样可以作为一个整体来管理。通过对组进行操作,可以轻松移动、缩放、旋转整个 SVG 图像。
使用场景
- 动态加载 SVG: 你可以从服务器或用户输入动态加载 SVG 内容,并将其显示在 Fabric.js 的画布上。
- 编辑 SVG: 解析后的 Fabric.js 对象可以直接编辑,允许你在应用程序中提供 SVG 图像的编辑功能。
- 导入外部图形: 将外部的矢量图形导入到你的 Fabric.js 画布中,以便进行进一步的操作或展示。
通过 fabric.loadSVGFromString
,你可以轻松地将 SVG 数据集成到 Fabric.js 的绘图环境中,为创建复杂、可交互的矢量图形应用提供了便利。
