środa, 10 czerwca 2015

[HTML5] Podstawy pracy z Canvas

TRUE
5067432574550638982
Element Canvas pojawił się dopiero w HTML5. Służy on do rysowania grafiki w oknie przeglądarki bezpośrednio za pomocą Javascriptu. Sam z siebie jest w HTML5 jedynie pustym polem, w którym następnie za pomocą odpowiednich metod w Javascripcie rysować możemy dynamicznie dane elementy. Możliwości elementu Canvas jeśli chodzi o rysowane obiekty są praktycznie nieograniczone i zależą jedynie od programisty. Podobnie jak w przypadku biblioteki GD w języku PHP mamy tutaj zestaw kilku predefiniowanych metod slużących do generowania podstawowych kształtów, co za tym idzie - tworząc ich kombinacje jesteśmy w stanie wygenerować właściwie dowolny obiekt.

W artykule tym przyjrzymy się podstawom generowania takiej grafiki za pomocą Canvas i javascriptowych metod. Narysujemy sobie kilka podstawowych kształtów i omówimy jak to wszystko mniej więcej działa.

Element Canvas

Pierwszym krokiem zawsze będzie utworzenie pustego obiektu typu Canvas, co zrobimy następująco:
[code]
<canvas id="myCanvas" width="400" height="300"></canvas>[/code]
Przy okazji dodamy sobie do niego obramowanie:
[code]
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Canvas</title>
<style>
#myCanvas {
  border: 1px solid #000;
}
</style>
</script>
</head>
<body>
<canvas id="myCanvas" width="400" height="300"></canvas>
</body>
</html>
[/code]


Wygenerowało nam to pusty obiekt Canvas, który następnie obsłużyć musimy za pomocą JavaScriptu. Do naszego Canvasa odwołamy się w JS za pomocą identyfikatora #myCanvas.
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');
</script>[/code]
Kolejnym krokiem jest utworzenie specjalnego obiektu służącego do rysowania w przestrzeni 2D, robimy to następująco:
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');

// Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
var context = canvas.getContext("2d");
</script>[/code]
Warto nadmienić, iż za pomocą getContext() możemy także utworzyć obiekt służący do operacji w przestrzeni 3D (za pomocą WebGL).
My jednak pozostańmy przy 2D. W tym momencie mamy już gotowy do generowania grafiki element Canvas, pora coś narysować. Wszystkie operacje związane z rysowaniem wykonywać będziemy za pomocą metod obiektu context. Zacznijmy od czegoś prostego, np. od wygenerowania wypełnionego prostokąta.

Rysujemy wypełniony prostokąt - fillRect()

Do rysowania wypełnionego prostokąta służy metoda:
[code]fillRect(x, y, width, height);[/code]
gdzie:

  • x - współrzędna X od której rysujemy
  • y - współrzędna Y od której rysujemy
  • width - szerokość prostokąta
  • height - wysokość prostokąta

Warto pamiętać, iż współrzędne liczymy od początku elementu Canvas na stronie, a nie od początku samej strony.
Liczymy je oczywiscie od lewego, górnego rogu.
Narysujmy ten prostokąt:
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');

// Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
var context = canvas.getContext("2d");

// Rysujemy prostokąt
context.fillRect(5, 5, 120, 100);
</script>[/code]
Domyślnie wypełni się on kolorem czarnym:

My jednak nie chcemy, aby był czarny i kolor chcemy sobie zdefiniować sami, np. czerwony.
Kolor definiujemy we własności fillStyle:
[code]fillStyle = wartość_koloru;[/code]
gdzie wartość koloru możemy podać tak jak w stylu CSS, możemy też podać tutaj gradient, lub deseń.
Na początek podajmy zwykły kolor, niech to będzie czerwony, czyli:
[code]fillStyle = '#ff0000';[/code]
Pamiętajmy, że wartość koloru wypełnienia definiujemy przez wygenerowaniem obiektu, nasz kod wyglądać więc będzie tak:
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');

// Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
var context = canvas.getContext("2d");

// definiujemy kolor wypełnienia (czerwony)
context.fillStyle = '#ff0000';

// Rysujemy prostokąt
context.fillRect(5, 5, 120, 100);
</script>[/code]
Co w efekcie da nam piękny czerwony prostokąt:

Jak teraz dodać obramowanie do naszego prostokąta?
W standardowy sposób się nie da. Aby stworzyć obrys, czyli obramowanie użyć musimy metody:
[code]stroke();[/code]
Kolor obrysu definiujemy we własności:
[code]strokeStyle = wartość_koloru;[/code]
Jego grubość w pikselach natomiast za pomocą:
[code]lineWidth = wartość w px;[/code]
Metoda stroke() rysuje obrys na zdefiniowanej wcześniej ścieżce.
W naszym przypadku ścieżką tą będzie nasz prostokąt, ale tym razem nie wypełniony, gdyż metoda:
[code]fillRect()[/code]
zamyka ścieżkę wypełniając prostokąt, więc nie możemy jej użyć do narysowania obrysu.
Zamiast tego skorzystamy ze zwykłej metody:
[code]rect();[/code]
która generuje jedynie ścieżkę prostokąta, ale nie wypełnia go kolorem.
Zrobimy to więc następująco:
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');

// Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
var context = canvas.getContext("2d");

// definiujemy kolor wypełnienia (czerwony)
context.fillStyle = '#ff0000';

// definiujemy grubość obramowania (6px)
context.lineWidth = '6';

// definiujemy kolor obramowania (czarny)
context.strokeStyle = '#000000';

// Tworzymy ścieżkę w postaci prostokąta
context.rect(5, 5, 120, 100);

// Rysujemy obrys ścieżki:
context.stroke();
</script>[/code]
Jak widzimy, działa:
Mamy obrys, ale zniknęło nam wypełnienie.
Aby teraz wypełnić stworzoną ścieżkę kolorem używamy metody:
[code]fill();[/code]
Wypełnia ona ścieżkę kolorem zdefiniowanym wsześniej we własności fillStyle.
Dodajmy więc do naszego kodu wypełnienie:
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');

// Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
var context = canvas.getContext("2d");

// definiujemy kolor wypełnienia (czerwony)
context.fillStyle = '#ff0000';

// definiujemy grubość obramowania (6px)
context.lineWidth = '16';

// definiujemy kolor obramowania (czarny)
context.strokeStyle = '#000000';

// Tworzymy ścieżkę w postaci prostokąta
context.rect(5, 5, 120, 100);

// Wypełniamy ścieżkę kolorem:
context.fill();

// Rysujemy obrys ścieżki:
context.stroke();
</script>[/code]
Wynik:

Warto tutaj zauważyć, iż wypełnienie daliśmy w kodzie przed narysowaniem obrysu.
Zrobiliśmy tak dlatego, gdyż w odwrotnej kolejności wypełnienie przykryłoby nam obrys - obiekty są generowane warstwowo w kolejności takiej w jakiej występują w kodzie.

Wskaźnik i rysowanie linii - moveTo()

Javascript podczas generowania grafiki w elemencie Canvas korzysta z czegoś w rodzaju wirtualnego wskaźnika, który jest ustawiany na danej pozycji. Można to porównać do ołówka i rysowania na kartce. Gdy coś rysujemy, ołówek jest takim wskaźnikiem i rysując coś na kartce przesuwamy po niej ołówek tworząc tym samym rysunek. W Javascript działa to tak samo, tyle tylko, że nie widzimy tego "ołówka", ale możemy określić za to dokładnie jego współrzędne. Na takiej zasadzie między innymi rysujemy linię. Procedura jest następująca: określamy punkt startowy naszego "ołówka", czyli współrzędną w elemencie Canvas oraz punkt końcowy. Javascript następnie przeciągnie nasz "ołówek" od punktu początkowego do punktu końcowego, tworząc tym samym linię.
Punkt początkowy ustawiamy za pomocą metody:
[code]moveTo(x, y);[/code]
gdzie x i y to współrzędne w jakich ustawiamy wskaźnik.

Punkt końcowy do którego ma się po linii prostej przesunąć wskaźnik określamy za pomocą:
[code]lineTo(x, y);[/code]
gdzie x i y to współrzędne do jakich przesuwamy wskaźnik.
Po stworzeniu takiej ścieżki całość oczywiście potraktujemy metodą, która stworzy nam tam obrys, czyli stroke(). Inaczej nie zobaczylibyśmy efektu takiego działania.

Narysujmy więc sobie linię prowadzącą od początku obiektu Canvas (0,0) do jego końca (400, 300).
Nasz kod wyglądać będzie tak:
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');

// Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
var context = canvas.getContext("2d");

// definiujemy grubość obramowania (6px)
context.lineWidth = '16';

// definiujemy kolor obramowania (czarny)
context.strokeStyle = '#000000';

// ustawiamy punkt początkowy
context.moveTo(0, 0);

// ustawiamy punkt końcowy
context.lineTo(400, 300);

// rysujemy obrys
context.stroke();
</script>[/code]
A efekt jego działania tak:

Rysowanie okręgu - arc()

Aby narysować okrąg musimy użyć metody:
[code]arc(x, y, r, angle_start, angle_stop);[/code]
gdzie:

  • x i y - współrzędne środka okręgu
  • r - promień okręgu
  • angle_start - kąt początkowy w radianach
  • angle_stop - kąt końcowy w radianach

Zauważmy, że kąty podajemy w radianach, a nie w stopniach, czyli w formie PI * liczba.
Przedstawia to poniższy obrazek:

źródło: w3schools


gdzie:

  • środek - arc(100, 75, 50, 0*Math.PI, 1.5*Math.PI)
  • kąt początkowy - arc(100, 75, 50, 0, 1.5*Math.PI)
  • kąt końcowy - arc(100, 75, 50, 0*Math.PI, 1.5*Math.PI) 

Narysujmy sobie okrąg w całości, gdzie kątem początkowym będzie 0, a kątem końcowym 2PI.
[code]
<script>
// przypisujemy element Canvas do zmiennej canvas
var canvas = document.getElementById('myCanvas');

// Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
var context = canvas.getContext("2d");

// definiujemy grubość obramowania (6px)
context.lineWidth = '6';

// definiujemy kolor obramowania (czarny)
context.strokeStyle = '#000000';

// rysujemy ścieżkę okręgu
context.beginPath();
context.arc(200, 150, 50, 0, 2*Math.PI);

// rysujemy obrys
context.stroke();
</script>[/code]
Wynik takiego działania:

Zauważmy, że wykorzystaliśmy tutaj metodę o nazwie:
[code]beginPath();[/code]
Metoda ta rozpoczyna rysowanie nowej ścieżki i zamyka poprzednią o ile wcześniej była taka stworzona.

Ścieżkę możemy też zamknąć za pomocą:
[code]closePath();[/code]

I to tyle tytułem wprowadzenia do elementu Canvas.
W następnych artykułach zobaczymy jak tworzyć tekst, operować na obrazkach, dokonywać transformacji i wiele innych ciekawych rzeczy.

Brak komentarzy:

Prześlij komentarz

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji