2016-10-22 4 views
2

Ich habe erfolgreich eine Zoom-Funktion implementiert, basierend auf this examplePaperJS Zoom- und Pan-

zoom: function(delta, point){ 
    if (!delta) return; 

    var 
     oldZoom = paper.view.zoom, 
     oldCenter = paper.view.center, 
     viewPos = paper.view.viewToProject(point); 
     newZoom = delta > 0 ? oldZoom * 1.05 : oldZoom/1.05; 

    if (!this.allowedZoom(newZoom)) return; 

    var 
     zoomScale = oldZoom/newZoom, 
     centerAdjust = viewPos.subtract(oldCenter), 
     offset = viewPos.subtract(centerAdjust.multiply(zoomScale)).subtract(oldCenter); 

    paper.view.center = view.center.add(offset); 
}, 

allowedZoom: function(zoom){ 
    zoom = Math.max(zoom, this.settings.minZoom); 
    zoom = Math.min(zoom, this.settings.maxZoom); 

    if (zoom !== paper.view.zoom) 
    { 
     paper.view.zoom = zoom; 
     return zoom; 
    } 
    return null; 
} 

aber dies berücksichtigt nicht die Position der Ansicht, wenn Sie auf die ursprünglichen scale = 1 verkleinern zurück. Was ich meine, ist, dass ich möchte, dass die Ansicht auf der Leinwandkante bleibt.

Hier ist ein Screenshot enter image description here

Antwort

1

Hier ist die Antwort, wenn jemand stolpert auf diese. Der Schlüssel ist einfach, die Grenzen der Ansicht zu überprüfen und dann entsprechend anzupassen:

bounds = paper.view.bounds; 

    if (bounds.x < 0) paper.view.center = paper.view.center.subtract(new Point(bounds.x, 0)); 
    if (bounds.y < 0) paper.view.center = paper.view.center.subtract(new Point(0, bounds.y)); 

    bounds = paper.view.bounds; 
    var 
     w = bounds.x + bounds.width, 
     h = bounds.y + bounds.height; 

    if (w > paper.view.viewSize.width) paper.view.center = paper.view.center.subtract(new Point(w - paper.view.viewSize.width, 0)); 
    if (h > paper.view.viewSize.height) paper.view.center = paper.view.center.subtract(new Point(0, h - paper.view.viewSize.height)); 
Verwandte Themen