ECharts 形态过渡动画
· 阅读时间约 14 分钟
TLDR
本文探讨 ECharts 如何实现不同形状之间的形态过渡动画。我们将研究源代码中的核心实现,将过程分解为关键步骤,包括路径转换、结构对齐和最佳旋转角度计算。通过这种分析,我们将了解 ECharts 如何在保持视觉连续性的同时实现平滑的形状变换。
引言
形态过渡动画是一种常见的动画效果,用于在不同形状之间平滑过渡,为用户提供柔和的视觉引导而不显得突兀。ECharts 也内置了这种效果,虽然与 GSAP 的过渡效果相比可能有一些不足,但它能满足大多数场景的动画需求。
以下内容需要对贝塞尔曲线有基本的了解。如果您不熟悉贝塞尔曲线,我强烈推荐观 看下面这个优秀的贝塞尔曲线教程视频。
形状形态过渡
在 ECharts 中,使用 applyMorphAnimation 函数作为形态过渡的入口点。 https://github.com/apache/echarts/blob/master/src/animation/morphTransitionHelper.ts#L110
// src/animation/morphTransitionHelper.ts
export function applyMorphAnimation(
from: DescendentPaths | DescendentPaths[],
to: DescendentPaths | DescendentPaths[],
divideShape: UniversalTransitionOption['divideShape'],
seriesModel: SeriesModel,
dataIndex: number,
animateOtherProps: (
fromIndividual: Path,
toIndividual: Path,
rawFrom: Path,
rawTo: Path,
animationCfg: ElementAnimateConfig
) => void
) {
// ...
}
您可以看到"from"和"to"的类型可以是数组,这意味着 ECharts 内部处理一对一、多对一、一对多的变换,多对多则由另一个函数实现。在这里,我们将从最简单的一对一示例开始深入细节。
在 Zrender/src/tool/morphPath.ts 文件中,您可以看到形态过渡效果的实现。
处理变换的过程主要涉及三个步骤:
- 将路径转换为三次贝塞尔曲线的数组。
- 对齐子路径,确保贝塞尔曲线的两个数组具有相同数量的子路径,并且每个子路径包含相同的贝塞尔曲线。
- 寻找最佳旋转角度,以避免过渡过程中出现扭曲和打结。