可滚动浏览器窗口内的画布(抓取位置)

时间:2014-02-27 15:44:54

标签: javascript jquery html canvas draw2d-js

在具有垂直滚动条的浏览器窗口中绘制画布时出现问题。

数字位于正确的位置,可以在画布周围抓取它并进行连接,但这只能在垂直滚动条(浏览器窗口)完全启动时才能实现。

当向下滚动窗口时,不再拖动节点,甚至当光标悬停在节点上时光标也会改变。 我发现滚动时可以拖动节点。不知何故,节点的“抓取区域”不会改变它的位置,就好像这个区域根据浏览器窗口有一个固定的位置。

我做错了什么?

obs。:不能发布图片:(,我没有足够的声誉。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我在Draw2d的google组中发布了相同的问题,并从框架开发人员Andreas Herz那里得到以下答案。
“喜

这是lib中的小设计缺陷。

正常情况下,可以“自动检测”div / canvas的滚动位置。但我现在没有。

解决方案:

使用Canvas#setScrollArea(DOMNode node)方法在draw2d.Canvas中设置滚动容器

或者:如果第一个解决方案不起作用,则由您自己计算

var canvas = new draw2d.Canvas("domId");

canvas.fromDocumentToCanvasCoordinate = $.proxy(function(x, y) {
    return new draw2d.geo.Point(
            (x - this.getAbsoluteX() + this.getScrollLeft())*this.zoomFactor,
            (y - this.getAbsoluteY() + this.getScrollTop())*this.zoomFactor);
},canvas);


/**
 * @method
 * Transforms a canvas coordinate to document coordinate.
 * 
 * @param {Number} x the x coordinate in the canvas 
 * @param {Number} y the y coordinate in the canvas
 * 
 * @returns {draw2d.geo.Point} the coordinate in relation to the document [0,0] position
 */
canvas.fromCanvasToDocumentCoordinate = $.proxy(function(x,y) {
    return new draw2d.geo.Point(
            ((x*(1/this.zoomFactor)) + this.getAbsoluteX() - this.getScrollLeft()),
            ((y*(1/this.zoomFactor)) + this.getAbsoluteY() - this.getScrollTop()));
},canvas);"

答案 1 :(得分:0)

您基本上需要修改该代码以抵消页面滚动位置

canvas.fromDocumentToCanvasCoordinate = $.proxy(function(x, y) {
    return new draw2d.geo.Point(
            (x + window.pageXOffset - this.getAbsoluteX() + this.getScrollLeft())*this.zoomFactor,
            (y + window.pageYOffset - this.getAbsoluteY() + this.getScrollTop())*this.zoomFactor);
},canvas);

canvas.fromCanvasToDocumentCoordinate = $.proxy(function(x,y) {
    return new draw2d.geo.Point(
            ((x*(1/this.zoomFactor)) + this.getAbsoluteX() - this.getScrollLeft() - window.pageXOffset),
            ((y*(1/this.zoomFactor)) + this.getAbsoluteY() - this.getScrollTop() - window.pageYOffset));
},canvas);