问题描述
我能够按比例缩小 x 轴和 y 轴,它用箭头键工作得很好,我想用触摸板 aswel。我在下面的代码中尝试了这个,它工作但不流畅。有时当我放大 X ,它甚至放大 Y ,反之亦然。 window.addEventListener('mousewheel',function(e) {
window.addEventListener('mousewheel',function(e) {
e.preventDefault();
yDelta = e.deltaY;
xDelta = e.deltaX;
if (yDelta < -1 && Math.round(xDelta) < 1) {
zoomOutY();
} else if (yDelta > 1 && Math.round(xDelta) < 1) {
zoomInY();
} else if (xDelta < -1 && Math.round(yDelta) < 1) {
zoomOut();
} else if (xDelta > -1 && Math.round(yDelta) < 1) {
zoomIn();
}
},{
passive: false
});
再次与mousemove方法相同的问题,如何平滑地检测4个方向,下面是我的代码。
document.addEventListener('mousemove',mouseMoveMethod);
document.addEventListener('mousedown',mouseDownMethod);
document.addEventListener('mouseup',mouseUpMethod);
// Prevent context menu popup,so we can move our mouse.
document.addEventListener('contextmenu',function(e) {
e.preventDefault();
return false;
},false);
mouseMoveMethod = function(e) {
if (e.ctrlKey || mouseIsHeld) {
let offsetX = 0
let offsetY = 0
if (e.pageX > oldx && e.pageY == oldy) {
direction = "East";
offsetX -= 1
} else if (e.pageX == oldx && e.pageY > oldy) {
direction = "South";
offsetY += 1
} else if (e.pageX == oldx && e.pageY < oldy) {
direction = "north";
offsetY -= 1
} else if (e.pageX < oldx && e.pageY == oldy) {
offsetX += 1
direction = "West";
}
updateKeyboardPan(offsetX,offsetY);
oldx = e.pageX;
oldy = e.pageY;
})
同样在上面的代码中,我能够找到方向,但它滞后并挂在中间。这是正确的方法吗?或者我可以改进我的代码以改进我的滑动/鼠标滚轮方向,谢谢。
解决方法
我在 JavaScript 中发现了 quite interesting example 的多点触控触控板手势。
下面的代码片段利用它来覆盖触控板的 LCJS 图表交互。对我来说,它似乎以一种令人惊讶的直观方式执行放大/缩小捏合交互(2 个手指,向相反方向移动)和通过在同一方向拖动 2 个手指进行平移。
我没有找到任何方法来分别区分沿 X 和 Y 的捏合交互,似乎 JS 事件只是为两者获取了一个值,该值分配给 X.append(Y,ignore_index=True)
。
deltaY
const {
lightningChart
} = lcjs;
const {
createProgressiveTraceGenerator
} = xydata;
const chart = lightningChart().ChartXY();
const series = chart.addLineSeries()
createProgressiveTraceGenerator()
.setNumberOfPoints(1000)
.generate()
.toPromise()
.then(data => {
series.add(data)
})
chart.setMouseInteractionWheelZoom(false)
chart.onSeriesBackgroundMouseWheel((_,e) => {
const xInterval = chart.getDefaultAxisX().getInterval()
const yInterval = chart.getDefaultAxisY().getInterval()
if (e.ctrlKey) {
// Zoom in / out (no separation of X or Y amount!)
const zoomAmount = e.deltaY * 0.01
chart.getDefaultAxisX().setInterval(xInterval.start + zoomAmount * (xInterval.end - xInterval.start),xInterval.end - zoomAmount * (xInterval.end - xInterval.start),false,true)
chart.getDefaultAxisY().setInterval(yInterval.start + zoomAmount * (yInterval.end - yInterval.start),yInterval.end - zoomAmount * (yInterval.end - yInterval.start),true)
} else {
// Pan X and Y simultaneously.
const panX = e.deltaX * 0.001 * (xInterval.end - xInterval.start)
const panY = e.deltaY * -0.001 * (yInterval.end - yInterval.start)
chart.getDefaultAxisX().setInterval(xInterval.start + panX,xInterval.end + panX,true)
chart.getDefaultAxisY().setInterval(yInterval.start + panY,yInterval.end + panY,true)
}
e.preventDefault()
})