2016-12-19 1 views
4

Ici, nous travaillons dans fabric.js avec la création d'un outil de conception. Nous avons créé une zone de sélection personnalisée pour l'objet canvas dans fabric.js. Je lis le code source dans fabric.js, il génère une boîte carrée pour la boîte englobante, mais je veux changer à ma coutume. Apparence de la zone de sélection Quelqu'un peut-il me conseiller?Possibilité de surcharger la zone de sélection de la boîte englobante dans l'option fabricjs - controls

HERE DANCING DOTS SELECTION AREA

Nous voulons apparence personnalisée zone de sélection.

HERE FABRIC.JS DEFAULT SCRIPT

Nous avons essayé ce code context.setLineDash() pour la zone de sélection.

if (fabric.StaticCanvas.supports('setLineDash') === true) { 
    ctx.setLineDash([4, 4]); 
} 

Référez le code de Github fonctionne bien .Mais gagné `ma zone de travail.

Ici, nous avons attaché Borderdasharray création de propriété en fonction de tissu

fabric.Object.prototype.set({ 
     borderColor: 'green', 
     cornerColor: 'purple', 
     cornerSize: 33, 
     transparentCorners: false,padding:4, 
     borderDashArray:[50,25]   
    }); 

Mais nous avons besoin de créer des points d'animation de danse/mouvement des points pour cette zone de sélection fabric.js. Comment peut-on créer une zone de sélection personnalisée dans fabric.js?

+1

En supposant que vous voulez juste une zone de sélection en pointillés, vous pouvez il suffit de définir la propriété borderDashArray de l'objet (ex. obj.borderDashArray = [4,4]). – Ben

+0

Oui @Ben .. J'ai créé une boîte de sélection en pointillé, mais j'ai besoin de créer une boîte de sélection de points de pointage/de pointage-défilement dansant. Comment c'est possible ? –

+1

Voir http://fabricjs.com/clipping. Vous pouvez créer une animation pour agir sur borderDashArray et obtenir une sorte d'effet comme ça. – Ben

Répondre

4

Pour animation "borderDashArray"

Documentation: https://developer.mozilla.org/fr/docs/Web/API/CanvasRenderingContext2D/lineDashOffset

Démo: https://jsfiddle.net/bp4u8tsr/

var canvas = document.getElementById("canvas"); 
var ctx = canvas.getContext("2d"); 
var offset = 0; 

function draw() { 
  ctx.clearRect(0,0, canvas.width, canvas.height); 
  ctx.setLineDash([4, 2]); 
  ctx.lineDashOffset = -offset; 
  ctx.strokeRect(10,10, 100, 100); 
} 

function march() { 
  offset++; 
  if (offset > 16) { 
    offset = 0; 
  } 
  draw(); 
  setTimeout(march, 20); 
} 

march(); 

En fabricjs: object_interactivity.mixin.js et modifier drawBorders fonctionnent comme cette démo

Mise à jour:

fabric.Object.prototype.set({ 
     borderColor: 'green', 
     cornerColor: 'purple', 
     cornerSize: 33, 
     transparentCorners: false,padding:14, 
     borderDashArray:[50,25]   
    }); 
// initialize fabric canvas and assign to global windows object for debug 
var canvas = window._canvas = new fabric.Canvas('c',{width: 500, height: 500}); 
textbox = new fabric.Textbox('Hello, World!', { 
    width: 200, 
    height: 200, 
    top: 80, 
    left: 80, 
    fontSize: 50, 
    textAlign: 'center', 
}); 
canvas.add(textbox); 
textbox2 = new fabric.Textbox('Hello, World!', { 
    width: 200, 
    height: 200, 
    top: 160, 
    left: 160, 
    fontSize: 50, 
    textAlign: 'center', 
}); 
canvas.add(textbox2); 
canvas.renderAll(); 
canvas.setActiveObject(textbox); 
var offset = 0; 

    (function animate() { 
    offset++; 
    if (offset > 75) { 
     offset = 0; 
    } 
    canvas.contextContainer.lineDashOffset = -offset; 
    canvas.renderAll(); 
    fabric.util.requestAnimFrame(animate); 
    })(); 

    canvas.on('after:render', function() { 
    canvas.contextContainer.strokeStyle = 'green'; 
     canvas.contextContainer.setLineDash([50,25]); 
    canvas.forEachObject(function(obj) { 
     var bound = obj.getBoundingRect();    
     canvas.contextContainer.strokeRect(
     bound.left + 0.5, 
     bound.top + 0.5, 
     bound.width, 
     bound.height 
    ); 
    }) 
    }); 

Démo: https://jsfiddle.net/Da7SP/398/

+0

Dans votre idée sera appliqué certaines frontières statiques seulement. Est-il applicable à tous les objets de la toile? Ou bien il peut être défini comme dynamique pour chaque objet? –

+1

Que préférez-vous? – neopheus

+0

Bonjour @neopheus ...avez-vous mon idée? nous avons essayé votre code plusieurs fois, il montrera l'objet individuel seulement. mais nous devons définir chaque zone de sélection d'objets sera comme des points de danse/points en mouvement dans la toile. –

3

Pour la personnalisation:

borderDashArray: Dash stroke of borders 
    cornerDashArray: Dash stroke of corners 
    cornerStrokeColor: If corners are filled, this property controls the color of the stroke 
    cornerStyle: standrd 'rect' or 'circle' 
    selectionBackgroundColor: add an opaque or transparent layer to the selected object. 

Pour utiliser ceci:

fabric.Object.prototype.set({ 
    transparentCorners: false, 
    borderDashArray: ...... 
+1

Oui @neopheus, J'ai déjà utilisé votre code et j'ai créé la propriété borderdasharray dans Canvas fabric.js. Mais j'ai besoin de définir la propriété animée "Borderdasharray" comme des points de danse/points en mouvement.Comment y parvenir aimablement donner une idée pour cela? –