未验证 提交 b6732792 编写于 作者: Y Yi Shen 提交者: GitHub

Merge pull request #11705 from apache/minor-ticks

feat(axis): Add minorTicks and minorSplitLines
......@@ -23,7 +23,7 @@ import Model from '../../model/Model';
import AxisView from './AxisView';
import AxisBuilder from './AxisBuilder';
var elementList = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea'];
var elementList = ['axisLine', 'axisLabel', 'axisTick', 'minorTick', 'splitLine', 'minorSplitLine', 'splitArea'];
function getAxisLineShape(polar, rExtent, angle) {
rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse());
......@@ -72,6 +72,8 @@ export default AxisView.extend({
var radiusExtent = polar.getRadiusAxis().getExtent();
var ticksAngles = angleAxis.getTicksCoords();
var minorTickAngles = angleAxis.getMinorTicksCoords();
var labels = zrUtil.map(angleAxis.getViewLabels(), function (labelItem) {
var labelItem = zrUtil.clone(labelItem);
labelItem.coord = angleAxis.dataToCoord(labelItem.tickValue);
......@@ -85,7 +87,7 @@ export default AxisView.extend({
if (angleAxisModel.get(name + '.show')
&& (!angleAxis.scale.isBlank() || name === 'axisLine')
) {
this['_' + name](angleAxisModel, polar, ticksAngles, radiusExtent, labels);
this['_' + name](angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels);
}
}, this);
},
......@@ -133,7 +135,7 @@ export default AxisView.extend({
/**
* @private
*/
_axisTick: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
_axisTick: function (angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {
var tickModel = angleAxisModel.getModel('axisTick');
var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length');
......@@ -159,7 +161,45 @@ export default AxisView.extend({
/**
* @private
*/
_axisLabel: function (angleAxisModel, polar, ticksAngles, radiusExtent, labels) {
_minorTick: function (angleAxisModel, polar, tickAngles, minorTickAngles, radiusExtent) {
if (!minorTickAngles.length) {
return;
}
var tickModel = angleAxisModel.getModel('axisTick');
var minorTickModel = angleAxisModel.getModel('minorTick');
var tickLen = (tickModel.get('inside') ? -1 : 1) * minorTickModel.get('length');
var radius = radiusExtent[getRadiusIdx(polar)];
var lines = [];
for (var i = 0; i < minorTickAngles.length; i++) {
for (let k = 0; k < minorTickAngles[i].length; k++) {
lines.push(new graphic.Line({
shape: getAxisLineShape(polar, [radius, radius + tickLen], minorTickAngles[i][k].coord)
}));
}
}
this.group.add(graphic.mergePath(
lines, {
style: zrUtil.defaults(
minorTickModel.getModel('lineStyle').getLineStyle(),
zrUtil.defaults(
tickModel.getLineStyle(), {
stroke: angleAxisModel.get('axisLine.lineStyle.color')
}
)
)
}
));
},
/**
* @private
*/
_axisLabel: function (angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent, labels) {
var rawCategoryData = angleAxisModel.getCategories(true);
var commonLabelModel = angleAxisModel.getModel('axisLabel');
......@@ -214,7 +254,7 @@ export default AxisView.extend({
/**
* @private
*/
_splitLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
_splitLine: function (angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {
var splitLineModel = angleAxisModel.getModel('splitLine');
var lineStyleModel = splitLineModel.getModel('lineStyle');
var lineColors = lineStyleModel.get('color');
......@@ -248,7 +288,35 @@ export default AxisView.extend({
/**
* @private
*/
_splitArea: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
_minorSplitLine: function (angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {
if (!minorTickAngles.length) {
return;
}
var minorSplitLineModel = angleAxisModel.getModel('minorSplitLine');
var lineStyleModel = minorSplitLineModel.getModel('lineStyle');
var lines = [];
for (var i = 0; i < minorTickAngles.length; i++) {
for (let k = 0; k < minorTickAngles[i].length; k++) {
lines.push(new graphic.Line({
shape: getAxisLineShape(polar, radiusExtent, minorTickAngles[i][k].coord)
}));
}
}
this.group.add(graphic.mergePath(lines, {
style: lineStyleModel.getLineStyle(),
silent: true,
z: angleAxisModel.get('z')
}));
},
/**
* @private
*/
_splitArea: function (angleAxisModel, polar, ticksAngles, minorTickAngles, radiusExtent) {
if (!ticksAngles.length) {
return;
}
......
......@@ -17,7 +17,7 @@
* under the License.
*/
import {retrieve, defaults, extend, each} from 'zrender/src/core/util';
import {retrieve, defaults, extend, each, map} from 'zrender/src/core/util';
import * as formatUtil from '../../util/format';
import * as graphic from '../../util/graphic';
import Model from '../../model/Model';
......@@ -246,10 +246,12 @@ var builders = {
var axisModel = this.axisModel;
var opt = this.opt;
var tickEls = buildAxisTick(this, axisModel, opt);
var ticksEls = buildAxisMajorTicks(this, axisModel, opt);
var labelEls = buildAxisLabel(this, axisModel, opt);
fixMinMaxLabelShow(axisModel, labelEls, tickEls);
fixMinMaxLabelShow(axisModel, labelEls, ticksEls);
buildAxisMinorTicks(this, axisModel, opt);
},
/**
......@@ -568,42 +570,27 @@ function isNameLocationCenter(nameLocation) {
return nameLocation === 'middle' || nameLocation === 'center';
}
function buildAxisTick(axisBuilder, axisModel, opt) {
var axis = axisModel.axis;
if (!axisModel.get('axisTick.show') || axis.scale.isBlank()) {
return;
}
var tickModel = axisModel.getModel('axisTick');
var lineStyleModel = tickModel.getModel('lineStyle');
var tickLen = tickModel.get('length');
var ticksCoords = axis.getTicksCoords();
function createTicks(ticksCoords, tickTransform, tickEndCoord, tickLineStyle, aniid) {
var tickEls = [];
var pt1 = [];
var pt2 = [];
var matrix = axisBuilder._transform;
var tickEls = [];
for (var i = 0; i < ticksCoords.length; i++) {
var tickCoord = ticksCoords[i].coord;
pt1[0] = tickCoord;
pt1[1] = 0;
pt2[0] = tickCoord;
pt2[1] = opt.tickDirection * tickLen;
pt2[1] = tickEndCoord;
if (matrix) {
v2ApplyTransform(pt1, pt1, matrix);
v2ApplyTransform(pt2, pt2, matrix);
if (tickTransform) {
v2ApplyTransform(pt1, pt1, tickTransform);
v2ApplyTransform(pt2, pt2, tickTransform);
}
// Tick line, Not use group transform to have better line draw
var tickEl = new graphic.Line({
// Id for animation
anid: 'tick_' + ticksCoords[i].tickValue,
anid: aniid + '_' + ticksCoords[i].tickValue,
subPixelOptimize: true,
shape: {
x1: pt1[0],
......@@ -611,22 +598,80 @@ function buildAxisTick(axisBuilder, axisModel, opt) {
x2: pt2[0],
y2: pt2[1]
},
style: defaults(
lineStyleModel.getLineStyle(),
{
stroke: axisModel.get('axisLine.lineStyle.color')
}
),
style: tickLineStyle,
z2: 2,
silent: true
});
axisBuilder.group.add(tickEl);
tickEls.push(tickEl);
}
return tickEls;
}
function buildAxisMajorTicks(axisBuilder, axisModel, opt) {
var axis = axisModel.axis;
var tickModel = axisModel.getModel('axisTick');
if (!tickModel.get('show') || axis.scale.isBlank()) {
return;
}
var lineStyleModel = tickModel.getModel('lineStyle');
var tickEndCoord = opt.tickDirection * tickModel.get('length');
var ticksCoords = axis.getTicksCoords();
var ticksEls = createTicks(ticksCoords, axisBuilder._transform, tickEndCoord, defaults(
lineStyleModel.getLineStyle(),
{
stroke: axisModel.get('axisLine.lineStyle.color')
}
), 'ticks');
for (let i = 0; i < ticksEls.length; i++) {
axisBuilder.group.add(ticksEls[i]);
}
return ticksEls;
}
function buildAxisMinorTicks(axisBuilder, axisModel, opt) {
var axis = axisModel.axis;
var minorTickModel = axisModel.getModel('minorTick');
if (!minorTickModel.get('show') || axis.scale.isBlank()) {
return;
}
var minorTicksCoords = axis.getMinorTicksCoords();
if (!minorTicksCoords.length) {
return;
}
var lineStyleModel = minorTickModel.getModel('lineStyle');
var tickEndCoord = opt.tickDirection * minorTickModel.get('length');
var minorTickLineStyle = defaults(
lineStyleModel.getLineStyle(),
defaults(
axisModel.getModel('axisTick').getLineStyle(),
{
stroke: axisModel.get('axisLine.lineStyle.color')
}
)
);
for (var i = 0; i < minorTicksCoords.length; i++) {
var minorTicksEls = createTicks(
minorTicksCoords[i], axisBuilder._transform, tickEndCoord, minorTickLineStyle, 'minorticks_' + i,
);
for (let k = 0; k < minorTicksEls.length; k++) {
axisBuilder.group.add(minorTicksEls[k]);
}
}
}
function buildAxisLabel(axisBuilder, axisModel, opt) {
var axis = axisModel.axis;
var show = retrieve(opt.axisLabelShow, axisModel.get('axisLabel.show'));
......
......@@ -27,17 +27,9 @@ var axisBuilderAttrs = [
'axisLine', 'axisTickLabel', 'axisName'
];
var selfBuilderAttrs = [
'splitArea', 'splitLine'
'splitArea', 'splitLine', 'minorSplitLine'
];
// function getAlignWithLabel(model, axisModel) {
// var alignWithLabel = model.get('alignWithLabel');
// if (alignWithLabel === 'auto') {
// alignWithLabel = axisModel.get('axisTick.alignWithLabel');
// }
// return alignWithLabel;
// }
var CartesianAxisView = AxisView.extend({
type: 'cartesianAxis',
......@@ -115,8 +107,6 @@ var CartesianAxisView = AxisView.extend({
var p1 = [];
var p2 = [];
// Simple optimization
// Batching the lines if color are the same
var lineStyle = lineStyleModel.getLineStyle();
for (var i = 0; i < ticksCoords.length; i++) {
var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);
......@@ -153,6 +143,63 @@ var CartesianAxisView = AxisView.extend({
}
},
/**
* @param {module:echarts/coord/cartesian/AxisModel} axisModel
* @param {module:echarts/coord/cartesian/GridModel} gridModel
* @private
*/
_minorSplitLine: function (axisModel, gridModel) {
var axis = axisModel.axis;
var minorSplitLineModel = axisModel.getModel('minorSplitLine');
var lineStyleModel = minorSplitLineModel.getModel('lineStyle');
var gridRect = gridModel.coordinateSystem.getRect();
var isHorizontal = axis.isHorizontal();
var minorTicksCoords = axis.getMinorTicksCoords();
if (!minorTicksCoords.length) {
return;
}
var p1 = [];
var p2 = [];
var lineStyle = lineStyleModel.getLineStyle();
for (var i = 0; i < minorTicksCoords.length; i++) {
for (let k = 0; k < minorTicksCoords[i].length; k++) {
var tickCoord = axis.toGlobalCoord(minorTicksCoords[i][k].coord);
if (isHorizontal) {
p1[0] = tickCoord;
p1[1] = gridRect.y;
p2[0] = tickCoord;
p2[1] = gridRect.y + gridRect.height;
}
else {
p1[0] = gridRect.x;
p1[1] = tickCoord;
p2[0] = gridRect.x + gridRect.width;
p2[1] = tickCoord;
}
this._axisGroup.add(new graphic.Line({
anid: 'minor_line_' + minorTicksCoords[i][k].tickValue,
subPixelOptimize: true,
shape: {
x1: p1[0],
y1: p1[1],
x2: p2[0],
y2: p2[1]
},
style: lineStyle,
silent: true
}));
}
}
},
/**
* @param {module:echarts/coord/cartesian/AxisModel} axisModel
* @param {module:echarts/coord/cartesian/GridModel} gridModel
......
......@@ -26,7 +26,7 @@ var axisBuilderAttrs = [
'axisLine', 'axisTickLabel', 'axisName'
];
var selfBuilderAttrs = [
'splitLine', 'splitArea'
'splitLine', 'splitArea', 'minorSplitLine'
];
export default AxisView.extend({
......@@ -44,6 +44,7 @@ export default AxisView.extend({
var polar = radiusAxis.polar;
var angleAxis = polar.getAngleAxis();
var ticksCoords = radiusAxis.getTicksCoords();
var minorTicksCoords = radiusAxis.getMinorTicksCoords();
var axisAngle = angleAxis.getExtent()[0];
var radiusExtent = radiusAxis.getExtent();
......@@ -54,7 +55,7 @@ export default AxisView.extend({
zrUtil.each(selfBuilderAttrs, function (name) {
if (radiusAxisModel.get(name + '.show') && !radiusAxis.scale.isBlank()) {
this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords);
this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords);
}
}, this);
},
......@@ -80,8 +81,7 @@ export default AxisView.extend({
cx: polar.cx,
cy: polar.cy,
r: ticksCoords[i].coord
},
silent: true
}
}));
}
......@@ -98,6 +98,39 @@ export default AxisView.extend({
}
},
/**
* @private
*/
_minorSplitLine: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords, minorTicksCoords) {
if (!minorTicksCoords.length) {
return;
}
var minorSplitLineModel = radiusAxisModel.getModel('minorSplitLine');
var lineStyleModel = minorSplitLineModel.getModel('lineStyle');
var lines = [];
for (var i = 0; i < minorTicksCoords.length; i++) {
for (let k = 0; k < minorTicksCoords[i].length; k++) {
lines.push(new graphic.Circle({
shape: {
cx: polar.cx,
cy: polar.cy,
r: minorTicksCoords[i][k].coord
}
}));
}
}
this.group.add(graphic.mergePath(lines, {
style: zrUtil.defaults({
fill: null
}, lineStyleModel.getLineStyle()),
silent: true
}));
},
/**
* @private
*/
......
......@@ -173,7 +173,7 @@ Axis.prototype = {
* `axis.getTicksCoords` considers `onBand`, which is used by
* `boundaryGap:true` of category axis and splitLine and splitArea.
* @param {Object} [opt]
* @param {number} [opt.tickModel=axis.model.getModel('axisTick')]
* @param {Model} [opt.tickModel=axis.model.getModel('axisTick')]
* @param {boolean} [opt.clamp] If `true`, the first and the last
* tick must be at the axis end points. Otherwise, clip ticks
* that outside the axis extent.
......@@ -205,6 +205,33 @@ Axis.prototype = {
return ticksCoords;
},
/**
* @return {Array.<Array.<Object>>} [{ coord: ..., tickValue: ...}]
*/
getMinorTicksCoords: function () {
if (this.scale.type === 'ordinal') {
// Category axis doesn't support minor ticks
return [];
}
var minorTickModel = this.model.getModel('minorTick');
var splitNumber = minorTickModel.get('splitNumber');
// Protection.
if (!(splitNumber > 0 && splitNumber < 100)) {
splitNumber = 5;
}
var minorTicks = this.scale.getMinorTicks(splitNumber);
var minorTicksCoords = map(minorTicks, function (minorTicksGroup) {
return map(minorTicksGroup, function (minorTick) {
return {
coord: this.dataToCoord(minorTick),
tickValue: minorTick
};
}, this);
}, this);
return minorTicksCoords;
},
/**
* @return {Array.<Object>} [{
* formattedLabel: string,
......
......@@ -166,7 +166,7 @@ axisDefault.valueAxis = zrUtil.merge({
// scale: false,
// AxisTick and axisLabel and splitLine are caculated based on splitNumber.
splitNumber: 5
splitNumber: 5,
// Interval specifies the span of the ticks is mandatorily.
// interval: null
......@@ -177,6 +177,30 @@ axisDefault.valueAxis = zrUtil.merge({
// Specify max interval when auto calculate tick interval.
// maxInterval: null
minorTick: {
// Minor tick, not available for cateogry axis.
show: false,
// Split number of minor ticks. The value should be in range of (0, 100)
splitNumber: 5,
// Lenght of minor tick
length: 3,
// Same inside with axisTick
// Line style
lineStyle: {
// Default to be same with axisTick
}
},
minorSplitLine: {
show: false,
lineStyle: {
color: '#eee',
width: 1
}
}
}, defaultOption);
axisDefault.timeAxis = zrUtil.defaults({
......
......@@ -81,12 +81,92 @@ var IntervalScale = Scale.extend({
},
/**
* @param {boolean} [expandToNicedExtent=false] If expand the ticks to niced extent.
* @return {Array.<number>}
*/
getTicks: function () {
return helper.intervalScaleGetTicks(
this._interval, this._extent, this._niceExtent, this._intervalPrecision
);
getTicks: function (expandToNicedExtent) {
var interval = this._interval;
var extent = this._extent;
var niceTickExtent = this._niceExtent;
var intervalPrecision = this._intervalPrecision;
var ticks = [];
// If interval is 0, return [];
if (!interval) {
return ticks;
}
// Consider this case: using dataZoom toolbox, zoom and zoom.
var safeLimit = 10000;
if (extent[0] < niceTickExtent[0]) {
if (expandToNicedExtent) {
ticks.push(roundNumber(niceTickExtent[0] - interval));
}
else {
ticks.push(extent[0]);
}
}
var tick = niceTickExtent[0];
while (tick <= niceTickExtent[1]) {
ticks.push(tick);
// Avoid rounding error
tick = roundNumber(tick + interval, intervalPrecision);
if (tick === ticks[ticks.length - 1]) {
// Consider out of safe float point, e.g.,
// -3711126.9907707 + 2e-10 === -3711126.9907707
break;
}
if (ticks.length > safeLimit) {
return [];
}
}
// Consider this case: the last item of ticks is smaller
// than niceTickExtent[1] and niceTickExtent[1] === extent[1].
var lastNiceTick = ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1];
if (extent[1] > lastNiceTick) {
if (expandToNicedExtent) {
ticks.push(lastNiceTick + interval);
}
else {
ticks.push(extent[1]);
}
}
return ticks;
},
/**
* @param {number} [splitNumber=5]
* @return {Array.<Array.<number>>}
*/
getMinorTicks: function (splitNumber) {
var ticks = this.getTicks(true);
var minorTicks = [];
var extent = this.getExtent();
for (var i = 1; i < ticks.length; i++) {
var nextTick = ticks[i];
var prevTick = ticks[i - 1];
var count = 0;
var minorTicksGroup = [];
var interval = nextTick - prevTick;
var minorInterval = interval / splitNumber;
while (count < splitNumber - 1) {
var minorTick = numberUtil.round(prevTick + (count + 1) * minorInterval);
// For the first and last interval. The count may be less than splitNumber.
if (minorTick > extent[0] && minorTick < extent[1]) {
minorTicksGroup.push(minorTick);
}
count++;
}
minorTicks.push(minorTicksGroup);
}
return minorTicks;
},
/**
......
......@@ -53,14 +53,15 @@ var LogScale = Scale.extend({
},
/**
* @param {boolean} [expandToNicedExtent=false] If expand the ticks to niced extent.
* @return {Array.<number>}
*/
getTicks: function () {
getTicks: function (expandToNicedExtent) {
var originalScale = this._originalScale;
var extent = this._extent;
var originalExtent = originalScale.getExtent();
return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) {
return zrUtil.map(intervalScaleProto.getTicks.call(this, expandToNicedExtent), function (val) {
var powVal = numberUtil.round(mathPow(this.base, val));
// Fix #4158
......@@ -75,6 +76,12 @@ var LogScale = Scale.extend({
}, this);
},
/**
* @param {number} splitNumber
* @return {Array.<Array.<number>>}
*/
getMinorTicks: intervalScaleProto.getMinorTicks,
/**
* @param {number} val
* @return {string}
......
......@@ -79,42 +79,4 @@ export function fixExtent(niceTickExtent, extent) {
if (niceTickExtent[0] > niceTickExtent[1]) {
niceTickExtent[0] = niceTickExtent[1];
}
}
export function intervalScaleGetTicks(interval, extent, niceTickExtent, intervalPrecision) {
var ticks = [];
// If interval is 0, return [];
if (!interval) {
return ticks;
}
// Consider this case: using dataZoom toolbox, zoom and zoom.
var safeLimit = 10000;
if (extent[0] < niceTickExtent[0]) {
ticks.push(extent[0]);
}
var tick = niceTickExtent[0];
while (tick <= niceTickExtent[1]) {
ticks.push(tick);
// Avoid rounding error
tick = roundNumber(tick + interval, intervalPrecision);
if (tick === ticks[ticks.length - 1]) {
// Consider out of safe float point, e.g.,
// -3711126.9907707 + 2e-10 === -3711126.9907707
break;
}
if (ticks.length > safeLimit) {
return [];
}
}
// Consider this case: the last item of ticks is smaller
// than niceTickExtent[1] and niceTickExtent[1] === extent[1].
if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
ticks.push(extent[1]);
}
return ticks;
}
}
\ No newline at end of file
此差异已折叠。
......@@ -83,7 +83,7 @@ under the License.
chart.setOption({
legend: {
data: ['line', 'line2']
data: ['line']
},
tooltip: {
trigger: 'axis',
......@@ -101,6 +101,12 @@ under the License.
},
yAxis: {
scale: true,
minorTick: {
show: true
},
minorSplitLine: {
show: true
},
splitLine: {
// show: false
}
......
......@@ -48,9 +48,7 @@ under the License.
return (Math.random() + 3).toFixed(3);
}
var chart = echarts.init(document.getElementById('main'), null, {
});
var chart = echarts.init(document.getElementById('main'));
......@@ -98,9 +96,16 @@ option = {
},
yAxis: {
type: 'value',
boundaryGap: [0, '100%'],
// boundaryGap: [0, '100%'],
max: 'dataMax',
splitLine: {
show: false
},
minorSplitLine: {
show: true
},
minorTick: {
show: true
}
},
series: [{
......
......@@ -12,6 +12,7 @@
"axis-interval": 3,
"axis-interval2": 3,
"axis-lastLabel": 5,
"axis-minorTick": 1,
"axis-multiple": 1,
"axis-style": 2,
"axisPosition": 2,
......
[{"name":"Action 1","ops":[{"type":"mousemove","time":182,"x":412,"y":361},{"type":"mousedown","time":326,"x":422,"y":355},{"type":"mousemove","time":412,"x":421,"y":355},{"type":"mousemove","time":618,"x":227,"y":434},{"type":"mousemove","time":827,"x":190,"y":452},{"type":"mouseup","time":939,"x":190,"y":452},{"time":940,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":966,"x":190,"y":452},{"type":"mousemove","time":1166,"x":179,"y":336},{"type":"mousemove","time":1372,"x":159,"y":302},{"type":"mousedown","time":1392,"x":159,"y":302},{"type":"mousemove","time":1588,"x":260,"y":372},{"type":"mousemove","time":1808,"x":390,"y":452},{"type":"mousemove","time":2008,"x":392,"y":453},{"type":"mouseup","time":2110,"x":392,"y":453},{"time":2111,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":2151,"x":392,"y":452},{"type":"mousemove","time":2351,"x":411,"y":356},{"type":"mousemove","time":2551,"x":425,"y":320},{"type":"mousemove","time":2751,"x":334,"y":339},{"type":"mousedown","time":2810,"x":332,"y":335},{"type":"mousemove","time":2951,"x":415,"y":363},{"type":"mousemove","time":3152,"x":570,"y":368},{"type":"mousemove","time":3352,"x":575,"y":368},{"type":"mouseup","time":3401,"x":575,"y":368},{"time":3402,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":3469,"x":575,"y":368},{"type":"mousemove","time":3669,"x":445,"y":295},{"type":"mousemove","time":3869,"x":550,"y":290},{"type":"mousemove","time":4069,"x":688,"y":294},{"type":"mousedown","time":4209,"x":688,"y":294},{"type":"mousemove","time":4236,"x":687,"y":294},{"type":"mousemove","time":4436,"x":381,"y":368},{"type":"mousemove","time":4640,"x":142,"y":401},{"type":"mousemove","time":4862,"x":39,"y":425},{"type":"mouseup","time":5196,"x":39,"y":425},{"time":5197,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":5921,"x":52,"y":431},{"type":"mousemove","time":6121,"x":186,"y":541},{"type":"mousemove","time":6323,"x":172,"y":563},{"type":"mousemove","time":6529,"x":121,"y":580},{"type":"mousemove","time":6738,"x":127,"y":579},{"type":"mousemove","time":6938,"x":129,"y":579},{"type":"mousedown","time":7034,"x":130,"y":579},{"type":"mousemove","time":7145,"x":132,"y":579},{"type":"mousemove","time":7348,"x":156,"y":576},{"type":"mousemove","time":7574,"x":187,"y":578},{"type":"mousemove","time":7830,"x":191,"y":578},{"type":"mouseup","time":7853,"x":191,"y":578},{"time":7854,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":8031,"x":194,"y":576},{"type":"mousemove","time":8239,"x":197,"y":576},{"type":"mousedown","time":8439,"x":197,"y":576},{"type":"mousemove","time":8548,"x":198,"y":576},{"type":"mousemove","time":8759,"x":242,"y":576},{"type":"mousemove","time":8988,"x":292,"y":575},{"type":"mousemove","time":9209,"x":325,"y":574},{"type":"mousemove","time":9442,"x":376,"y":572},{"type":"mousemove","time":9669,"x":390,"y":571},{"type":"mouseup","time":9908,"x":390,"y":571},{"time":9909,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":9949,"x":390,"y":571},{"type":"mousemove","time":10152,"x":778,"y":401},{"type":"mousemove","time":10467,"x":783,"y":401},{"type":"mousemove","time":10676,"x":772,"y":413},{"type":"mousemove","time":10933,"x":772,"y":411},{"type":"mousedown","time":10950,"x":772,"y":411},{"type":"mousemove","time":11137,"x":774,"y":397},{"type":"mousemove","time":11378,"x":779,"y":364},{"type":"mousemove","time":11663,"x":780,"y":359},{"type":"mouseup","time":12026,"x":780,"y":359},{"time":12027,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":12089,"x":779,"y":359},{"type":"mousemove","time":12295,"x":399,"y":318},{"type":"mousemove","time":12501,"x":311,"y":285},{"type":"mousedown","time":12584,"x":311,"y":285},{"type":"mousemove","time":12721,"x":335,"y":309},{"type":"mousemove","time":12932,"x":411,"y":369},{"type":"mousemove","time":13217,"x":509,"y":410},{"type":"mousemove","time":13418,"x":516,"y":412},{"type":"mouseup","time":13743,"x":516,"y":412},{"time":13744,"delay":400,"type":"screenshot-auto"},{"type":"mousemove","time":13820,"x":515,"y":412},{"type":"mousemove","time":14030,"x":483,"y":325},{"type":"mousedown","time":14196,"x":555,"y":306},{"type":"mousemove","time":14304,"x":554,"y":307},{"type":"mousemove","time":14600,"x":301,"y":417},{"type":"mousemove","time":14867,"x":246,"y":446},{"type":"mousemove","time":15069,"x":246,"y":446},{"type":"mouseup","time":15217,"x":246,"y":446},{"time":15218,"delay":400,"type":"screenshot-auto"}],"scrollY":2606,"scrollX":0,"timestamp":1574438055472}]
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册