2012-01-10 8 views
6

acabo de empezar con fabric.js y tengo una (probablemente principiante) Error:coordina lienzo en Fabric.js han compensado

estoy usando tela con jQuery con el siguiente código:

$(document).ready(function() { 

canvas = new fabric.StaticCanvas('scroller'); 

canvas.add(
    new fabric.Rect({ top: 0, left: 0, width: 140, height: 100, fill: '#f55' }) 
); 

}); 

Este código debe dibujar un Rectángulo de 140x100 en el lienzo. Lamentablemente, solo aparece un cuarto del rectángulo. Si cambio los valores superior e izquierdo a números más altos, aparecerá más rectángulo en el lienzo.

Parece que el origen del lienzo no está en 0/0, sino en el sth. mayor.

¿Alguien sabe cómo solucionar esto o lo que estoy haciendo mal?

Gracias de antemano, McFarlane

+0

Hola McFarlane =) Bienvenido a SO. Siempre que publiques código, siempre obtendrás una respuesta más rápida si publicas el código completo (o un ejemplo mínimo) en jsfiddle.net, solo ve allí, pega el código, guárdalo y vuelve a pegar el enlace =) – puk

+0

qué tamaño es tu lienzo? tal vez es más pequeño que '140x100'. Intente dibujar algo más como un círculo o una imagen para saber qué cuadrante se recorta – puk

Respuesta

8

Aquí hay un enlace jsFiddle con algunos ejemplos http://jsfiddle.net/pukster/sdQ7U/2/

Mi conjetura es que fabric.js calcula todo, desde el origen (punto medio) ya que está llegando exactamente un cuarto de un rectángulo incluso con un lienzo 10 veces el tamaño del rectángulo. Mi suposición es que top y left en realidad se refieren al origen y no a los lados superior e izquierdo del cuadro delimitador imaginario. El problema es que hay muy poca documentación sobre fabricjs. ¿Hay alguna razón por la que está utilizando fabricjs y no easeljs

EDITAR Aquí está la misma violín pero con plazas en lugar de rectángulos (es más clara) http://jsfiddle.net/pukster/sdQ7U/3/

EDITAR OK Ahora estoy casi completamente seguro de que fabric.js usa el centro como top/left. Arranqué su example off of their site y lo superpuse con la couterpart transparente a esas formas si hubieran sido codificadas en lienzo puro http://jsfiddle.net/pukster/uathZ/2/ (el borde azul es el límite del elemento canvas).

Overlayed Pure Canvas images

Lo que se ve es que las cajas son exactamente compensado por la mitad pero el círculo (que sólo dibujó un círculo semi de lo contrario no habría sido perceptible) se superponen perfectamente. Esto es b/c en HTML Canvas, las coordenadas del círculo (x,y) se refieren al origen y no a la esquina superior izquierda. No me molesté con el triángulo b/c mi trigonometría está un poco oxidada. Personalmente creo que es engañoso usar los términos top y left, cuando x y y hubieran sido más representativos y más cortos.

+1

Gracias por su respuesta detallada. Tienes razón, los orígenes del objeto FabricJS están en el medio del objeto. Actualmente estoy utilizando fabricJS porque es un Framework todo en uno con muchas funciones excelentes (por ejemplo, compatibilidad con SVG, que usaré más adelante). Tal vez cambie a procesamiento js. Intentaré y compararé los dos más tarde. – McFarlane

+0

@McFarlane: ¿procedió con esto y cuál fue el resultado? Me interesaría un seguimiento, incluida la comparación que mencionas. –

+3

FWIW, estamos planeando cambiar a originX/originY siendo left/top de forma predeterminada en la próxima versión 1.4. La mayoría de los usuarios consideran que esto es más intuitivo. – kangax

5

Sí, esto es muy inesperado y aún más indocumentado.

Solución:

Conjunto

originX: "left" 
originY: "top" 

para cada objeto creado.

edit: o use la solución kangax más simple en el comentario a continuación.

+3

No tiene que establecerlo para cada objeto. La tela toma una gran ventaja de la herencia, por lo que podría hacer 'fabric.Object.prototype.originX = true; fabric.Object.prototype.originY = true; ' – kangax

+2

Odio criticar al autor de una biblioteca por su propio comentario, pero no debería ser' fabric.Object.prototype.originX = "left; fabric.Object.prototype.originY = "top"; '? – markerikson

+1

kangax, respeto por el proyecto y la pista. permítanme poner otra diatriba constructiva: los objetos livianos como los objetos de dibujo deberían ser los últimos que usen la herencia por motivos de rendimiento. – citykid

1

Quiero comentar, pero carezco de la reputación para hacerlo. Así que de todos modos, aquí es lo que sucede cuando lo haga lo siguiente:

fabric.Object.prototype.originX = "left"; 
fabric.Object.prototype.originY = "top"; 

La forma se rindió bien, pero cuando lo selecciono para cambiar el tamaño o en movimiento, se pone a compensar a una ubicación diferente. El mejor enfoque parece ser establecer las coordenadas para cada objeto por separado utilizando el método set().