@antv/g2
Version:
the Grammar of Graphics in Javascript
81 lines (74 loc) • 1.86 kB
text/typescript
import { each, throttle } from '@antv/util';
import TransformAction from './scale-transform';
/**
* 缩放 Scale 的 Action
* @ignore
*/
class ScaleTranslate extends TransformAction {
private zoomRatio = 0.05;
/**
* 缩小
*/
public zoomIn() {
this.zoom(this.zoomRatio);
}
private zoom(scale) {
const dims = this.dims;
each(dims, (dim) => {
this.zoomDim(dim, scale);
});
this.context.view.render(true);
}
/**
* 放大
*/
public zoomOut() {
this.zoom(-1 * this.zoomRatio);
}
// 缩放度量
private zoomDim(dim, dRatio) {
if (this.hasDim(dim)) {
const scale = this.getScale(dim);
if (scale.isLinear) {
this.zoomLinear(dim, scale, dRatio);
}
// else { // 暂时仅处理连续字段
// this.zoomCategory(dim, scale, normalPoint);
// }
}
}
// linear 度量平移
private zoomLinear(dim, scale, dRatio) {
const view = this.context.view;
// 只有第一次缓存,否则无法回滚
if (!this.cacheScaleDefs[dim]) {
this.cacheScaleDefs[dim] = {
// @ts-ignore
nice: scale.nice,
min: scale.min,
max: scale.max,
};
}
// 使用使用原始度量作为缩放标准
const scaleDef = this.cacheScaleDefs[dim];
const range = scaleDef.max - scaleDef.min;
const { min, max } = scale;
const d = dRatio * range;
const toMin = min - d;
const toMax = max + d;
const curRange = toMax - toMin;
const scaled = curRange / range;
if (toMax > toMin && scaled < 100 && scaled > 0.01) {
view.scale(scale.field, {
// @ts-ignore
nice: false,
min: min - d,
max: max + d,
});
}
}
// 平移分类的度量
// private translateCategory(dim, scale, normalPoint) {
// }
}
export default ScaleTranslate;