簡體   English   中英

Javascript Canvas平移畫布

[英]Javascript Canvas panning the canvas

當用戶按下鼠標並移動它時,我試圖平移畫布,但是由於某種原因,它似乎無法工作,我看不到它。 有任何想法嗎?

    canvas.addEventListener('mousedown', onMouseDown, false); 

    function onMouseDown(event){
        var mousePos = new Vector(event.clientX, event.clientY);
        mousedown = true;
    }

    canvas.addEventListener('mouseup', onMouseUp, false); 
    function onMouseUp(event){
        mousedown = false;
    }

    canvas.addEventListener('mousemove', onMouseMove, false); 
    function onMouseMove(event){
        mousePos = new Vector(event.clientX, event.clientY);
        if(onMouseDown){
            var difference = mousePos.subtract(previousMousePosition);
            pan.add(difference);
        }
        previousMousePosition = mousePos;
    }

    pan = new Vector(0, 0);

我也收到一條錯誤消息,指出未定義Vector,並且也為mousePos.subtract定義了一個。 這是我的vector.js:

var Vector = (function () {
function Vector(pX, pY) {
    this.setX(pX);
    this.setY(pY);

};
Vector.prototype.getX = function() {

    return this.mX;
};
Vector.prototype.setX = function (pX) {
    this.mX = pX;
};
Vector.prototype.getY = function() {

    return this.mY;
};
Vector.prototype.setY = function(pY) {
    this.mY = pY;
};

return Vector;
})();

您可以使用translate轉換來平移畫布內容。

context.translate(x,y)將畫布原點水平移動x像素,垂直移動y像素。

因此要向右平移5個像素,您可以context.translate(-5,0)

使用轉換的好處是您不必更改現有的圖形代碼-翻譯會自動將所有圖形按指定方向“移動”。

[另外:展示如何從用戶的鼠標拖動中獲得網絡平移]

 function log(){console.log.apply(console,arguments);} var canvas=document.getElementById("canvas"); var ctx=canvas.getContext("2d"); var cw=canvas.width; var ch=canvas.height; function reOffset(){ var BB=canvas.getBoundingClientRect(); offsetX=BB.left; offsetY=BB.top; } var offsetX,offsetY; reOffset(); window.onscroll=function(e){ reOffset(); } window.onresize=function(e){ reOffset(); } var isDown=false; var startX,startY; var netPanningX=0; var netPanningY=0; var $results=$('#results'); for(var x=0;x<100;x++){ ctx.fillText(x,x*20+netPanningX,ch/2); } for(var y=-50;y<50;y++){ ctx.fillText(y,cw/2,y*20+netPanningY); } $("#canvas").mousedown(function(e){handleMouseDown(e);}); $("#canvas").mousemove(function(e){handleMouseMove(e);}); $("#canvas").mouseup(function(e){handleMouseUp(e);}); $("#canvas").mouseout(function(e){handleMouseOut(e);}); function handleMouseDown(e){ // tell the browser we're handling this event e.preventDefault(); e.stopPropagation(); startX=parseInt(e.clientX-offsetX); startY=parseInt(e.clientY-offsetY); // Put your mousedown stuff here isDown=true; } function handleMouseUp(e){ // tell the browser we're handling this event e.preventDefault(); e.stopPropagation(); mouseX=parseInt(e.clientX-offsetX); mouseY=parseInt(e.clientY-offsetY); // Put your mouseup stuff here isDown=false; } function handleMouseOut(e){ // tell the browser we're handling this event e.preventDefault(); e.stopPropagation(); mouseX=parseInt(e.clientX-offsetX); mouseY=parseInt(e.clientY-offsetY); // Put your mouseOut stuff here isDown=false; } function handleMouseMove(e){ if(!isDown){return;} // tell the browser we're handling this event e.preventDefault(); e.stopPropagation(); mouseX=parseInt(e.clientX-offsetX); mouseY=parseInt(e.clientY-offsetY); // dx & dy are the distance the mouse has moved since // the last mousemove event var dx=mouseX-startX; var dy=mouseY-startY; startX=mouseX; startY=mouseY; // accumulate the net panning done netPanningX+=dx; netPanningY+=dy; $results.text('Net change in panning: x:'+netPanningX+', y:'+netPanningY); ctx.clearRect(0,0,cw,ch); for(var x=-50;x<50;x++){ ctx.fillText(x,x*20+netPanningX,ch/2); } for(var y=-50;y<50;y++){ ctx.fillText(y,cw/2,y*20+netPanningY); } } 
 body{ background-color: ivory; } #canvas{border:1px solid red; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <h4 id=results>Drag the mouse to see net panning in x,y directions</h4> <canvas id="canvas" width=300 height=300></canvas> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM