2017-06-21 5 views
1

Ich versuche, Rechteck mit der Maus auf der Leinwand zu zeichnen. Hier ist mein erster Versuch:Angular 2: Rechteck auf Leinwand mit Maus zeichnen.

private captureEvents(canvasEl: HTMLCanvasElement) { 

    Observable 
    .fromEvent(canvasEl, 'mousedown') 
    .subscribe((res: MouseEvent) => { 
    console.log('MOUSE DOWN'); 
    const rect = canvasEl.getBoundingClientRect(); 
    this.originPoint = new Point(); 
    this.originPoint.x = res.clientX; 
    this.originPoint.y = res.clientY; 
    this.startPoint = new Point(); 
    this.startPoint.x = res.clientX - rect.left; 
    this.startPoint.y = res.clientY - rect.top; 
    }); 

    Observable 
    .fromEvent(canvasEl, 'mouseup') 
    .subscribe((res: MouseEvent) => { 
    console.log('MOUSE UP'); 
    let w: number = res.clientX - this.originPoint.x ; 
    let h: number = res.clientY - this.originPoint.y; 
    this.cx.rect(this.startPoint.x, this.startPoint.y, w, h); 
    this.cx.stroke(); 
    } 
); 
} 

Dies funktioniert, aber es zeigt, Rechteck nach mouseUp Ereignis, und ich möchte die Zeichnung Rechteck sehen, wenn Sie die Maus bewegen.

+0

So wird die 'mouse down' Zeichenfolge in der Konsole protokolliert, aber das Rechteck wird nicht gezeichnet, bis 'mouse up' protokolliert wird. –

+0

Ja, es ist so implementiert. Ich würde gerne den "Fortschritt" des Zeichnens sehen, während ich die Maus ziehe. Aber ich habe keine Ahnung, wie ich das umsetzen soll. –

+0

Haben Sie versucht, das onmousemove-Ereignis zu verwenden? –

Antwort

0
function drawRectsObservable() { 
    const svg = document.getElementById("drawRects"); 
    const mousedrag = Observable.fromEvent<MouseEvent>(svg, 'mousedown') 
    .map(e=>({event:e, svgBounds: svg.getBoundingClientRect()})) 
    .map(({event, svgBounds})=> ({ 
     rect: new Elem(svg, 'rect') 
     .attr('x', event.clientX - svgBounds.left) 
     .attr('y', event.clientY - svgBounds.top) 
     .attr('width', 5) 
     .attr('height', 5) 
     .attr('fill', '#95B3D7'), 
     svgBounds: svgBounds})) 
    .subscribe(({rect,svgBounds})=>{ 
     const ox = Number(rect.attr('x')), oy = Number(rect.attr('y')); 
     Observable.fromEvent<MouseEvent>(svg, 'mousemove') 
     .takeUntil(Observable.fromEvent(svg, 'mouseup')) 
     .map(({clientX, clientY})=>({ 
      rect, ox, oy, 
      x: clientX - svgBounds.left, 
      y: clientY - svgBounds.top})) 
     .subscribe(({rect, ox, oy, x, y})=> 
      rect.attr('x', Math.min(x,ox)) 
       .attr('y', Math.min(y,oy)) 
       .attr('width', Math.abs(ox - x)) 
       .attr('height', Math.abs(oy - y)) 
     ); 
    }); 
} 
+2

Vielen Dank für Ihre Antwort, aber bitte nicht blobs Code, erklären, was Sie getan haben, oder und was OP falsch gemacht hat. –