真实 mccharts,不重写配置
option、setOption、dispatchAction、dataZoom 都保持上游语义。 现有图表配置无需翻译,客户端只替换最后的绘制后端。
同一份 option,不走 WebView。mccharts 3.0.0 的模型与动画在 ArkTS 中运行, 图形交给 GLES 3.0 批量绘制,文字回到 ArkUI 原生渲染。 从折线、柱状到 10 万点散点演示,一行配置,两端同源。
在线预览直接运行 mccharts 3.0.0,与客户端共享同一份 option 与 demo 工厂。
mccharts 负责它最擅长的部分:模型、布局、动画与交互语义; 原生层只做最后一公里——把显示列表变成可批量提交的几何与文字。
option、setOption、dispatchAction、dataZoom 都保持上游语义。 现有图表配置无需翻译,客户端只替换最后的绘制后端。
三角形、线性渐变、裁剪与纹理统一进入 native painter。 VBO 容量复用与脏区增量上传,减少每帧重复搬运整张场景。
文字不烘焙进贴图。由 ArkUI Text 真实排版,中文字体清晰, 并接入无障碍描述与屏幕阅读语义。
Pan、Pinch、Tap 由原生手势组仲裁。dataZoom 与 brush 都需要显式开启, 默认不抢走页面的滚动。
1 千 / 1 万 / 10 万原始点的演示页,初始 500 点窗口。 单指平移、双指缩放,过滤与原始索引仍由 mccharts 负责。
magicType、restore、dataZoom、dataView 与 saveAsImage 走同一套动作管线; 框选、数据视图编辑和原生 Surface 快照已经在真机上完成页面级联调。
右侧不是流程图装饰,而是真实的渲染链路。每一段都有自己的边界、诊断与测试。
3.0.0 的模型、布局、动画与 dataZoom 过滤在 ArkTS 中运行, 由系统帧时钟提供活跃时间,隐藏与后台自动暂停。
mccharts.setOption(option)
zrender 的可见图元被翻译成顶点、颜色、命令与文字运行。 裁剪、渐变与纹理仍按用户坐标计算。
NativeFrame { vertices, texts }
C++ 侧批量提交三角形;VBO 容量复用、脏区上传。 单帧顶点预算 150 万,超限会给出明确诊断。
glDrawArrays(...)
真实字形由 ArkUI Text 叠加,使用 UIContext 测量。 可选的纹理文字快照保留裁剪与原生绘制顺序。
<Text>26℃</Text>
以上为约束与诊断阈值,不是性能承诺。性能、功耗与像素画质仍未完成设备验收。
组件入口是 McChartsV2。把已有的 option 交进来,
需要外部控制时再挂上 McChartsController。
当前是本地 HAR 组件,尚未发布至 ohpm;使用 file 依赖接入。
组件只要求 options;按引用替换触发更新,不递归观察大数组。
dataZoom / brush 显式开启;快照导出需要 rasterText。
最低系统版本与性能指标尚未验收;当前状态为 Native P0 技术预览。
import { McChartsV2, McChartsController } from '@mcui/mccharts';
import type { Options } from '@mcui/mccharts';
@Entry
@ComponentV2
struct SalesPage {
private controller: McChartsController = new McChartsController();
@Local option: Options = {
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', data: ['一月', '二月', '三月'] },
yAxis: { type: 'value' },
series: [{ type: 'line', smooth: true, data: [120, 180, 150] }]
};
build() {
McChartsV2({ options: this.option, controller: this.controller })
.width('100%')
.height(390)
}
}
// 任意时刻提交新的 option(合并语义)
this.controller.setOption({
series: [{ id: 'sales', data: [132, 201, 168] }]
});
// 派发真实的 mccharts action
this.controller.dispatchAction({
type: 'highlight',
seriesIndex: 0,
dataIndex: 2
});
// 订阅系列点击
this.controller.on('click', event => {
console.info(event.seriesType, event.name, event.value);
});
// 坐标查询与清理
const pixel = this.controller.convertToPixel(
{ seriesIndex: 0 }, [1, 120]
);
this.controller.dispose();
McChartsV2({
options: this.option,
controller: this.controller,
// 显式开启 inside dataZoom 的单指平移 / 双指缩放
enableDataZoom: true,
// 显式开启 brush / 工具栏拖动
enableBrush: true,
// 可选:纹理文字快照,导出 PNG 时必须开启
rasterText: true,
onChartClick: (event) => {
console.info(`${event.seriesType} · ${event.name}`);
}
})
.width('100%')
.height(390)