@antv/f2
Version:
Charts for mobile visualization.
168 lines (167 loc) • 4.33 kB
JavaScript
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;
;