UNPKG

@antv/f2

Version:

Charts for mobile visualization.

168 lines (167 loc) 4.33 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _util = require("@antv/util"); var _jsx = require("../../jsx"); function concatPoints(children) { var result = []; for (var i = 0; i < children.length; i++) { var child = children[i]; result = result.concat(child.points); } return result; } function formatPoint(point) { var y = point.y; return { x: point.x, y: (0, _util.isArray)(y) ? y[1] : y }; } function getPoint(points, t) { var formatedPoints = points.map(function (p) { return formatPoint(p); }); var firstPoint = formatedPoints[0]; var lastPoint = formatedPoints[formatedPoints.length - 1]; var xOffset = lastPoint.x - firstPoint.x; var x = firstPoint.x + xOffset * t; for (var i = 1; i < formatedPoints.length; i++) { var point = formatedPoints[i]; var prevPoint = formatedPoints[i - 1]; if (x >= prevPoint.x && x <= point.x) { // x 在 2 点之间的比例,根据比例再算出 y 的值 var ratio = (x - prevPoint.x) / (point.x - prevPoint.x); return { x: x, y: prevPoint.y + (point.y - prevPoint.y) * ratio }; } } } function AnimationEndView(props) { var record = props.record, appear = props.appear, EndView = props.EndView; var children = record.children; var points = concatPoints(children); var origin = points[0].origin; return (0, _jsx.jsx)("group", { animation: { appear: { easing: appear.easing, duration: appear.duration, onFrame: function onFrame(t) { // 这段逻辑有点恶心。。 var element = this.element; var children = element.get('children'); var point = getPoint(points, t); children.forEach(function (child) { child.moveTo(point.x, point.y); }); } } } }, (0, _jsx.jsx)(EndView, { origin: origin })); } var _default = function _default(props) { var records = props.records, coord = props.coord, animation = props.animation, EndView = props.endView, clip = props.clip; var left = coord.left, top = coord.top, width = coord.width, height = coord.height, center = coord.center, startAngle = coord.startAngle, endAngle = coord.endAngle, radius = coord.radius; var appear = coord.isPolar ? { easing: 'quadraticOut', duration: 450, clip: { type: 'sector', property: ['endAngle'], attrs: { x: center.x, y: center.y, startAngle: startAngle, r: radius }, start: { endAngle: startAngle }, end: { endAngle: endAngle } } } : { easing: 'quadraticOut', duration: 450, clip: { type: 'rect', property: ['width'], attrs: { x: left, y: top, height: height }, start: { width: 0 }, end: { width: width } } }; return (0, _jsx.jsx)("group", { attrs: { clip: clip } }, records.map(function (record) { var key = record.key, children = record.children; return (0, _jsx.jsx)("group", { key: key }, children.map(function (child) { var points = child.points, color = child.color, size = child.size, shape = child.shape; return (0, _jsx.jsx)("polyline", { attrs: (0, _objectSpread2.default)((0, _objectSpread2.default)({ points: points.map(function (point) { return { x: point.x, y: point.y }; }), stroke: color }, shape), {}, { lineWidth: size || shape.lineWidth }), animation: (0, _util.deepMix)({ update: { easing: 'linear', duration: 450, property: ['points'] }, appear: appear }, animation) }); }), EndView ? (0, _jsx.jsx)(AnimationEndView, { record: record, EndView: EndView, appear: appear }) : null); })); }; exports.default = _default;