v0.1首个版本化设计基线查看版本范围
Developer

构建交互式绘图应用

这个流程展示如何组合 asset + canvas + input,而不把场景树或应用对象放进宿主。

1. 声明能力和资源

{
  "apiVersion": "0.1",
  "assets": { "fonts/ui": "assets/ui.woff2" },
  "capabilities": [
    "host:asset.loadFont",
    "host:canvas.getInfo",
    "host:canvas.draw",
    "host:canvas.measureText",
    "host:input.focus"
  ]
}

2. 初始化布局

const font = await host.asset.loadFont('fonts/ui');
const info = await host.canvas.getInfo('main');
if (!info) throw new Error('main canvas missing');

const [label] = await host.canvas.measureText('main', ['新建'], font);
const model = createSceneModel(info, label.width); // guest 内存中的 L2/L3 状态

3. 处理输入

await host.input.focus('main');

host.events.on('input.pointer', (event) => {
  if (event.canvasId !== 'main') return;
  model.handlePointer(event);
  model.dirty = true;
});

命中测试在 guest 中使用自己的场景模型完成。宿主只提供输入事实与真实绘图面。

4. 每帧批量绘制

host.events.on('canvas.frame', async ({ canvasId }) => {
  if (canvasId !== 'main' || !model.dirty) return;
  model.dirty = false;
  await host.canvas.draw('main', model.toDrawOperations(font));
});

把一帧的指令放在一个批次中,避免每个图形都跨 guest/host 边界。

5. 处理尺寸变化

host.events.on('canvas.resize', ({ width, height }) => {
  model.resize(width, height);
  model.dirty = true;
});

软件像素路径

模拟器或体素渲染器可以把第 4 步换成 canvas.present()。像素缓冲与场景状态仍属于 guest;这条路径不要升级成宿主场景引擎。

相关参考

canvas.draw()canvas.present()input.pointerasset.loadFont()

Host API 版本与分层概览Host API v0.1版本非正式提议提议canvas API呈现canvas.getInfo()方法canvas.draw()方法canvas.present()方法canvas.measureText()方法canvas.frame event事件canvas.resize event事件asset API呈现asset.read()方法asset.loadFont()方法playback API呈现playback.open()方法playback.write()方法playback.stop()方法playback.ready event事件playback.ended event事件input API输入input.focus()方法input.pointer event事件input.key event事件input.wheel event事件ime API输入ime.openSession()方法ime.updateState()方法ime.updateGeometry()方法ime.closeSession()方法ime.textUpdate event事件ime.composition event事件ime.formatUpdate event事件ime.characterBoundsRequest event事件capture API输入capture.requestCamera()方法capture.requestMic()方法capture.frame()方法capture.readAudio()方法capture.stop()方法capture.ended event事件store API数据store.get()方法store.put()方法store.delete()方法store.list()方法store.deletePrefix()方法clipboard API数据clipboard.readText()方法clipboard.writeText()方法clipboard.readImage()方法clipboard.writeImage()方法net API网络net.fetch()方法identity API身份identity.status()方法identity.login()方法identity.logout()方法env API平台集成env.snapshot()方法env.change event事件print API平台集成print.open()方法开始调用 Host API指南构建交互式绘图应用指南构建自绘文本编辑器指南管理媒体采集与播放指南组织本地数据与同步指南