Skip to content

Avatar 原生 JavaScript 与 Web Component 接入

返回 Avatar 总览,或阅读 Definition、自定义动画、React 与 Vue

原生 JavaScript

ts
import { createAvatar, createAvatarEditor } from '@oneworks/avatar-web'
import '@oneworks/avatar-web/style.css'

const previewHost = document.querySelector('#avatar')!
const editorHost = document.querySelector('#avatar-editor')!

const avatar = createAvatar(previewHost, {
  definition,
  animationLibraries: [supportAnimations],
  interactive: true,
  theme: 'system'
})
const editor = createAvatarEditor(editorHost, {
  definition,
  animationLibraries: [supportAnimations],
  locale: 'zh-Hans',
  theme: 'system'
})

editorHost.addEventListener('avatarchange', event => {
  avatar.setDefinition((event as CustomEvent).detail.definition)
})

await Promise.all([avatar.ready, editor.ready])
await avatar.play({
  libraryId: 'support',
  groupId: 'attention',
  clipId: 'acknowledge'
})

使用结束时调用 destroy()。渲染 mount 还提供 update()capture() 和播放控制;编辑器 mount 提供 update()focus()getDefinition()setDefinition()

Web Component

Web Component 不会在 import 时自动注册。应用必须显式调用一次注册函数,避免包在全局 customElements 上产生意外副作用。

ts
import { registerAvatarElements } from '@oneworks/avatar-web/elements'
import '@oneworks/avatar-web/style.css'

registerAvatarElements()

const avatar = document.querySelector('oneworks-avatar')!
const editor = document.querySelector('oneworks-avatar-editor')!

avatar.definition = definition
avatar.animationLibraries = [supportAnimations]
editor.definition = definition
editor.animationLibraries = [supportAnimations]
html
<oneworks-avatar interactive theme="dark"></oneworks-avatar>
<oneworks-avatar-editor locale="zh-Hans" theme="dark"></oneworks-avatar-editor>

复杂对象通过 DOM property 传递。属性只承载 autoplayinteractivethemelocale 等简单值。两个元素断开再重新连接时会保留最后的 definition。

控制器、事件与捕获

React ref、Vue expose 和原生 mount 提供 playpauseresumeseekstopgetDefinitionsetDefinitioncapture({ format, size, background, frame })<oneworks-avatar> 提供相同的播放和 capture 方法,但通过 definition DOM property 读写 definition,而不是 getDefinition() / setDefinition()

编辑器的 React ref、Vue expose 和原生 mount 提供 focusgetDefinitionsetDefinition<oneworks-avatar-editor> 则使用 focus()definition property。

事件按适配器使用各自的原生机制:React 使用 callback props;Vue 使用 emits;原生 mount host 与 Custom Element 派发 avatarreadyanimationstartanimationloopanimationendavatarerroravatarchange,编辑器对应 editoreadyavatarchange DOM CustomEvent。

手动旋转或移动交互会停止当前动画。autoplay 只会在 animation/autoplay 输入变化时启动,不会在手势更新 definition 后擅自重启。

当前边界

  • React、Vue、原生 JavaScript 与 Web Component 都使用在线编辑器的同一套几何 SVG 渲染链路,不会重画为 2D 替代品。
  • 目前没有公开 iframe/embed URL 或 postMessage 协议。需要嵌入编辑能力时使用 AvatarEditorOneWorksAvatarEditorcreateAvatarEditor<oneworks-avatar-editor>
  • 编辑器分享 URL 仍是不可拆解的 UI 持久化格式;不要手写或解析 entityPartsanimationData 等 query 参数。
  • AvatarDefinition 是应用运行时的数据源;编辑器 URL 是可继续编辑的来源;导出资源 URL 是可直接显示的静态或动画文件。这三者不要混用。

One Works 文档站独立构建,面向用户接入与使用。支持邮箱:support@oneworks.cloud