Manipulera HTML5 Canvas med Konva Del 4, Styling

I serieens andra handledning lärde du dig att rita några grundläggande former som rektanglar, cirklar och regelbundna polygoner med Konva. Den tredje handledningen täckte hur du kan använda Konva för att dra några mer komplexa former som stjärnor och ringar samt sprites på duken.

I denna handledning kommer vi att gå ett steg längre och lära oss hur du applicerar olika styling till former genom att ändra deras fyllnings- och strokevärden. Du kommer också att lära dig hur man kontrollerar opacitet av en form och tillämpar skuggor på den. I de sista sektionerna kommer du att lära dig hur du använder blandningslägen för att ange vad slutresultatet ska se ut om olika former överlappar varandra.

Tillämpa fyllning och stroke

Vi har använt fylla och stroke egenskaper från serieens första handledning. Vi har dock bara använt dem för att fylla former med en solid färg hittills. Du kan också fylla i form med gradienter (både linjär och radiell) samt bilder. Detsamma gäller för olika slag som appliceras på en form.

Det finns två sätt att applicera en fyllning till olika former. Du kan antingen ange fyllnadsvärde med hjälp av fylla egenskap när en form skapas först i Konva, eller du kan använda fylla() metod för att applicera en fyllning dynamiskt som svar på vissa händelser som svävar, knappklick, etc..

När du fyller ett element med en fast färg kan du ange ett värde för fylla egendom och det kommer att fungera bra. När du använder en linjär gradient för att fylla inuti en form måste du ange giltiga värden för många andra egenskaper som fillLinearGradientStartPointfillLinearGradientEndPoint, och fillLinearGradientColorStops. De två första egenskaperna accepterar objekt som anger x- och y-koordinaterna för start- och slutpunkterna för en gradient. Du kan också ange x- och y-värdena separat med hjälp av fillLinearGradientStartPointXfillLinearGradientStartPointYfillLinearGradientEndPointX, och fillLinearGradientEndPointY egenskaper.

Radiella gradienter har också samma uppsättning egenskaper, men ordet Linjär ersätts med Radiell. Två ytterligare egenskaper relaterade till radiella gradienter är fillRadialGradientStartRadius och fillRadialGradientEndRadius.

var canvasWidth = 600; var canvasHeight = 400; var stadium = ny Konva.Stage (container: "example", bredd: canvasWidth, height: canvasHeight); var layerA = nytt Konva.Layer (); var rectA = ny Konva.Rect (x: 25, y: 25, bredd: 200, höjd: 150, fillLinearGradientStartPoint: x: 0, y: 0, fillLinearGradientEndPoint: x: 200, y: 150, fillLinearGradientColorStops : [0, 'blå', 1, 'gul'], stroke: "svart"); var rectB = ny Konva.Rect (x: 375, y: 25, bredd: 200, höjd: 150, fillLinearGradientStartPoint: x: 0, y: 50, fillLinearGradientEndPoint: x: 100, y: -50 fillLinearGradientColorStops: [0, 'grön', 0,1, 'gul', 0,5, 'röd', 0,9, 'svart'], streck: "svart"); var rectC = ny Konva.Rectius: 0, fillRadialGradientEndRadius: 220, fillRadialGradientColorStops: [0, 'grön', 0,5, 'gul', 0,75, bredd: 200, höjd: 150, fillRadialGradientStartRadius: 'rött', 0,9, 'svart'], stroke: "svart"); var rectD = new Konva.Rectius: 150, fillRadialGradientStartPoint: x: 100, y: 75, fillRadialGradientEndPoint: x: 375, y: 200, bredd: 200, höjd: 150, fillRadialGradientStartRadius: 0, fillRadialGradientEndRadius: 100, y: 75, fillRadialGradientColorStops: [0, 'blå', 0,5, 'gul', 0,9, 'grön'], slag: "svart"); skiktA.add (rectA, rectB, rectC, rectD); stage.add (layerA); 

När det inte anges, antas start- och slutpunkten för en radiell gradient vara 0,0. Det är därför den radiella gradienten i den tredje rektangeln härstammar från det övre vänstra hörnet. Kom också ihåg att start- och slutpunkterna anges i förhållande till själva formen.

Precis som fyllningen kan du ställa in ett värde för strokefärg och slagbredd med stroke och strokeWidth egenskaper när en form initieras först. Du kan också dynamiskt ställa in båda dessa värden med hjälp av stroke() och strokewidth () metoder.

Skapa skuggor i Konva

Du kan använda skuggor till alla former som skapats med Konva med hjälp av fyra olika egenskaper som heter Shadow, shadowOffset, shadowBlur, och shadowOpacity. De shadowOffset egendom accepterar ett objekt med x och y komponenter som dess värde, men du kan också använda shadowOffsetX och shadowOffsetY att ange x och y koordinerar separat. Du har också möjlighet att aktivera och inaktivera skuggorna för en viss form med hjälp av shadowEnabled fast egendom.

Du kan styra opaciteten hos formen själv med hjälp av opacitet fast egendom. Observera att ett helt transparent objekt inte kommer att skuta någon skugga. På samma sätt, om du har ställt in fylla Färgen på en form till transparent, bara skuggan av dess stroke kommer att göras på duken.

var canvasWidth = 600; var canvasHeight = 400; var stadium = ny Konva.Stage (container: "example", bredd: canvasWidth, height: canvasHeight); var layerA = nytt Konva.Layer (); var rectA = ny Konva.Rect (x: 25, y: 25, bredd: 200, höjd: 150, hörnRadius: 5, fyll: "orange", opacitet: 0,5, shadowColor: "black", shadowOffset: x: -10, y: 10, shadowBlur: 10, slag: "svart"); var starA = ny Konva.Star (x: 400, y: 200, numPoäng: 10, innerRadius: 50, yttreRadius: 150, fyll: "transparent", stroke: "svart", stroke Bredd: 5, skuggaColor: "röd" , shadowOffset: x: 5, y: 5, shadowBlur: 0); skiktA.add (rectA, starA); stage.add (layerA); 

Ställa in shadowBlur egenskap till 0 gör skuggan så skarp som den ursprungliga formen själv. Om detta värde är för högt kommer skuggan att förlora den ursprungliga formen; Du kommer bara se en mörk lapp på duken.

Jag vill påpeka att du också kan skapa textskuggor med samma uppsättning egenskaper när du har instanserat en Konva.Text () objekt.

Använda blandningsmetoder

Hittills i serien gömde överlapp mellan former helt bottenformen helt. Det enda sättet att hålla bottenformen synlig var att göra alla former över det delvis genomskinliga. 

Ibland kanske du vill ha det slutliga resultatet efter överlappningen av olika former för att följa vissa regler. Det är exempelvis möjligt att bara visa den ljusare eller mörkare färgen i fall där formerna överlappar varandra. 

Konva tillåter dig att ange några värden för att bestämma hur färgerna på överlappande former ska blandas ihop med globalCompositeOperation fast egendom. Du kan läsa dokumentationen på MDN för att få mer information om fastigheten och alla möjliga värden.

I det följande exemplet har jag applicerat ett annat blandningsläge till var och en av rektanglarna placerade i hörnet av den centrala rektangeln.

var canvasWidth = 600; var canvasHeight = 400; var stadium = ny Konva.Stage (container: "example", bredd: canvasWidth, height: canvasHeight); var layerA = nytt Konva.Layer (); var rectCenter = ny Konva.Rect (x: 225, y: 125, bredd: 150, höjd: 150, fyll: "rgb (255, 100, 0)"); var rectA = ny Konva.Rect (x: 125, y: 25, bredd: 150, höjd: 150, fyll: "rgb (0, 200, 100)", globalCompositeOperation: "lighten"); var rectB = ny Konva.Rect (x: 325, y: 25, bredd: 150, höjd: 150, fyll: "rgb (0, 200, 100)", globalCompositeOperation: "darken"); var rectC = ny Konva.Rect (x: 125, y: 225, bredd: 150, höjd: 150, fyll: "rgb (0, 200, 100)", globalCompositeOperation: "nyans"); var rectD = ny Konva.Rect (x: 325, y: 225, bredd: 150, höjd: 150, fyll: "rgb (0, 255, 0)", globalCompositeOperation: "xor"); layerA.add (rectCenter, rectA, rectB, rectC, rectD); stage.add (layerA);

Färgen på den övre vänstra rektangeln är rgb (0, 200, 100), och den centrala rektanglets färg är rgb (255, 100, 0). När lätta blandningsläge tillämpas, rgb Komponenterna i båda färgerna jämförs individuellt, och de högre värdena för varje komponent används för att få den slutliga färgen. I vårt fall blir den sista färgen till det övre vänstra hörnet rgb (255, 200, 100).

När mörkna blandningsläge tillämpas, rgb Komponenterna i båda färgerna jämförs individuellt, och de lägre värdena för varje komponent används för att få den slutliga färgen. I vårt fall blir den sista färgen till det övre högra hörnet rgb (0, 100, 0).

När nyans blandningsläge appliceras, luma och krom på bottenfärgen kombineras med topptonens färg. Det är därför den slutliga färgen fortfarande är grön men blir lättare. När xor blandningsläge appliceras, den slutliga färgen blir transparent på alla överlappningsplatser.

Slutgiltiga tankar

I denna handledning lärde vi oss hur vi fyller en form med linjära eller radiella gradienter i stället för soliga färger. Vi lärde oss också att applicera skuggor till olika former och göra dem delvis transparenta med hjälp av opacitet fast egendom. Det sista avsnittet visade dig hur man använder blandningslägen för att ändra den slutliga färgen efter två överlappningar.

Om du har några frågor relaterade till denna handledning, var god och låt mig veta i kommentarerna. Nästa och sista handledning i serien kommer att lära dig hur man binder händelser till olika former i Konva.