HTML5-Tutorium: Canvas: Hello World 02: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 6: Zeile 6:
==Use Cases==
==Use Cases==


Wie im  [[HTML5-Tutorium: JavaScript: Hello World 01 ersten]] und   
Wie im  [[HTML5-Tutorium: JavaScript: Hello World 03|dritten]] und   
HTML5-Tutorium: JavaScript: Hello World 02|zweiten]] Teil des Hello-World-Tutoriums soll die ganze Welt begrüßt werden.
[[HTML5-Tutorium: JavaScript: Hello World 04|vierten Teil]] des Hello-World-Tutoriums soll die ganze der Name des Benutzers
erfragt werden, bevor er persönlich begrüßt wird.


Allerdings erfolgt die Ausgabe diesmal mit Hilfe eines Canvas-Elements.
Die Ausgabe erfolgt wie im  [[HTML5-Tutorium: Canvas: Hello World 01|ersten Teil]] des Canvas-Tutoriums mit Hilfe eines Canvas-Elements.
 
Die Anwendung soll wie  „App5“ des [[HTML5-Tutorium: JavaScript: Hello World 04|vierten Teil]]s des Hello-World-Tutoriums
aufgebaut sein:
 
* Die Initialisierungsinformationen werden aus JSON-Dateien eingelesen.
* Die Anwendung wird mit Hilfe von RequireJS modularisiert.


==Erstellen eines neuen Projektes==
==Erstellen eines neuen Projektes==
Erstellen Sie ein neues Projekt „<code>HelloWorldCanvas01</code>“.
Erstellen Sie ein neues Projekt „<code>HelloWorldCanvas02</code>“.
Kopieren Sie anschließend die Dateien „<code>index.html</code>“ und „<code>main.css</code>“  
Kopieren Sie anschließend Datei „<code>index5.html</code>“ sowie die Ordner
aus dem [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld02/ zweiten Teil des Tutoriums] und passen Sie den Titel in der HTML-Datei an.
„<code>web/css</code>“, „<code>web/init</code>“, „<code>web/js/app5</code>“ , „<code>web/js/lib/require</code>“
und die Datei „<code>web/js/main5.js</code>“
aus dem [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/ vierten Teil des Tutoriums]  
zusammen mit den darin enthaltenen Dateien in Ihr Projekt.  
 
Nehmen Sie folgende Umbenennungen vor (smartes [[Refactoring]]):


==<code>index.html</code>==
* <code>index5.html</code> → <code>index.html</code>
* <code>js/main5.js</code> → <code>js/main.js</code>
* <code>js/app5</code> → <code>js/app</code>


Ersetzen Sie das Body-Element Ihrer HTML-Datei durch folgendes Body-Element:
Vergessen Sie nicht, dass Sie in der Datei „<code>index.html</code>“ den Befehl


<source lang="html5">
<source lang="html5">
<body>
<script data-main="js/main5" src="js/lib/require/require.js"></script>
  <canvas id="canvas">
</source>
    Unfortunately, your browser doesn't support HTML5!
durch
  </canvas>
<source lang="html5">
  <script type = "text/javascript" src = "main.js"></script>
<script data-main="js/main" src="js/lib/require/require.js"></script>
</body>
</source>
</source>
ersetzen müssen. Und in der Konfigurationsanweisung von RequireJS ( Datei „<code>main.js</code>“)
müssen sie <code>app:  'app5'</code> entweder entfernen oder durch <code>app:  'app'</code> ersetzen.
Den Eintrag <code>wk:  'lib/wk_amd'</code> benötigen Sie auch nicht mehr (außer wenn Sie meine JSON-Bibliothek an Stelle der
des RequireJS-JSON-Plugins verwenden möchten).


Anstelle von HTML-Text-Elementen wie „<code>h1</code>“ und „<code>p</code>“
Passen Sie zu guter Letzt den Titel in der HTML-Datei „<code>index.html</code>“ an.
wird ein Canvas-Element zur Ausgabe von „Hello, World!“ verwendet.
Da die Ausgabe des Textes nur mittels JavaScript-Anweisungen erfolgen kann,
wird am Endes des Dokuments die JavaScript-Datei „<code>main.js</code>“
eingelesen.


==<code>main.js</code>==
Wenn Sie alles richtig gemacht haben, sollte jetzt der Code der ursprünglichen App5-Anwendung wieder laufen.  


Wie üblich wird die Web-Anwendung mit Hilfe der Datei „<code>main.js</code>“
Jetzt müssen Sie nur noch wenige Veränderungen am Code vornehmen, um die Ausgabe auf eine Canvas-Ausgabe umzustellen.
initialisiert und gestartet.


Viel muss hier nicht gemacht werden. Zunächst muss das
==<code>index.html</code>==
Canvas-Element, auf das der Text geschrieben werden soll,
 
aus dem HTML-Dokument geholt werden:
Ersetzen Sie Hello-Section-Elemente Ihrer HTML-Datei durch folgende Section-Element:


<source lang="javascript">
<source lang="html5">
var l_canvas = document.getElementById('canvas');
<section id="section1_hello" class="hidden">
  <canvas id="canvas1">
    Unfortunately, your browser doesn't support HTML5!
  </canvas>
</section>
</source>
</source>
 
und
Die Größe diese Canvas-Elements kann per JavaScript festgelegt werden.
<source lang="html5">
Man könnte sie auch direkt in HTML festlegen, aber die JavaScript-Lösung
<section id="section2_hello" class="hidden">
ist flexibler. Es bestünde hier {{zB}}  die Möglichkeit,
  <canvas id="canvas2">
die Größe abhängig vom Ausgabedevice festzulegen:
  </canvas>
 
</section>
<source lang="javascript">
l_canvas.width  = 300;
l_canvas.height = 60;
</source>
</source>


Als Größeneinheit kommt das Pixelmaß zu Einsatz. Die Bühne dieses Canvas-Elements ist 300 Pixel breit und 60 Pixel hoch.  
Dieser Schritt war in ähnlicher Form schon im [[HTML5-Tutorium:_Canvas:_Hello_World_01|ersten Teil des Canvas-Tutoriums]] notwendig.  


Für weiteren Aktionen benötigt man das Kontext-Objekt, mit dessen Hilfe
==<code>hello_de.json</code> und <code>hello_en.json</code>==
Pixelinformationen zu Canvas übermittelt werden sollen.


Wir verwenden zu diesem Zweck den 2D-Kontext. Das ist der einzige Kontext, der bislang vom [[W3C]] standardisiert wurde.<ref>[https://www.w3.org/TR/2dcontext/ W3C: HTML Canvas 2D Context]</ref>
Die Initialisierungs-Dateien „<code>hello_de.json</code>“ und „<code>hello_en.json</code>“ müssen an die neuen Gegebenheiten angepasst werden.
(Eine Alternative wäre der [[WebGL]]-Kontext, der das Rendern von 3D-Objekten mit Hilde von OpenGL unterstützt.<ref>[ https://www.khronos.org/webgl/ Kronos Group: WebGL]</ref> Das führt hier aber zu weit.)
Elemente, die es nicht mehr gibt – <code>"hello"</code> und <code>"welcome"</code> –, müssen entfernt werden,
neue Elemente  – <code>"canvas"</code> – müssen eingefügt werden und Initialwerte für da Canvas-Element
(Höhe, Breit, Fontangaben etc.) müssen ergänzt werden.


Beispielsweise sieht die Datei „<code>hello_de.json</code>“ nun folgendermaßen aus:
<source lang="javascript">
<source lang="javascript">
var l_context = l_canvas.getContext('2d');
{
</source>
  "HTMLElements":
  {
    "sectionForm":    "section2_form",
    "headingForm":    "heading2_form",
    "inputNameLabel": "label2_name",
    "inputName":      "input2_name",
    "buttonReset":    "button2_reset",
    "buttonSubmit":  "button2_submit",
    "sectionHello":  "section2_hello",
    "canvas":        "canvas2"
  },


Es gibt diverse 2D-Context-Befehle, die keine direkte Auswirkung auf die Bühne haben, sondern nur bestimmte Werte
  "text":
für nachfolgende Befehle festlegen. Typische Werte sind die Vordergrundfarbe, die Hintergrundfarbe, die Strichstärken, Fonteigenschaften etc.
  {
Die einmal eingestellten Werte werden solange verwendet, biss sie durch andere Anweisungen überschreiben werden.
    "title":  "Hello, Stranger!",
    "query":  "What's your name?",
    "reset":  "Reset",
    "submit":  "Say hello",
    "hello":  "Hello, $1!"
  },


Da wir einen Text ausgeben wollen, sollten wir zuvor geeignete Fonteigenschaften auswählen:
  "css":
  {
    "hidden": "hidden"
  },


<source lang="javascript">
  "canvas":
l_context.font = 'bold 40px "Times New Roman", Times, serif';
  {
    "width":  500,
    "height":  60,
    "font":  "bold 40px \"Times New Roman\", Times, serif",
    "hello_x": 35,
    "hello_y": 43
  }
}
</source>
</source>
==<code>greet.js</code>==


Nun muss der Text nur noch auf der Bühne des Canvas-Elements ausgegeben werden.  
Zu guter Letzt muss noch die Methode „<code>sayHello</code>“ in der Datei „<code>greet.js</code>“ angepasst werden.
Diese Methode soll nicht mehr den DOM-Baum manipulieren, sondern den Gruß in das Ihr übermittelte Canvas-Element schreiben.
Alle übrigen Methoden werden nicht verändert.


Die Methode  „<code>sayHello</code> funktioniert im Prinzip genauso wie die Initialisierungsfunktion
im ersten Teil des Tutoriums. Nur werden jetzt keine konstanten Werte mehr zum Initialisieren des Canvas verwendet, 
sondern Werte, die im Parameter „<code>p_init</code>“ übermittelt wurden:
<source lang="javascript">
<source lang="javascript">
l_context.fillText('Hello, World!', 35, 43);
l_this.sayHello =
</source>
  function ()
Zusätzlich zum Text werden eine $x$- und eine $y$-Koordinate angegeben. Der Punkt $(x,y) = (0,0)$
  {
bezeichnet die linke obere Ecke des Canvas-Elements. Größere $x$-Werte bezeichnen Punkte, die weiter rechts liegen, größere
    var l_init_elements = p_init.HTMLElements,
$y$-Werte bezeichnen Punkte, die – im Gegensatz zum mathematischen Koordinatensystem – weiter unter liegen.
        l_init_text    = p_init.text,
Der Referenzpunkt des Textes ist das linke Ende der Grundlinie des Zeichensatzes.
        l_init_hidden  = p_init.css.hidden,
        l_init_canvas  = p_init.canvas,
        l_name          = p_document.getElementById(l_init_elements.inputName).value,
        l_canvas        = p_document.getElementById(l_init_elements.canvas),
        l_context      = l_canvas.getContext('2d');


Insgesamt sieht die Datei „<code>main.js</code>“ somit folgendermaßen aus:
    l_canvas.width  = l_init_canvas.width;
<source lang="javascript">
    l_canvas.height = l_init_canvas.height;
/**
    l_context.font = l_init_canvas.font;
* Initializes and starts the web app.
*/
(function()
{
  // Initialize the canvas.
  var l_canvas = document.getElementById('canvas');
 
  l_canvas.width = 300;
  l_canvas.height =  60;


  // Print text on the canvas.
    l_context.fillText(l_init_text.hello.replace('$1', l_name), l_init_canvas.hello_x, l_init_canvas.hello_y);
  var l_context = l_canvas.getContext('2d');


  l_context.font = 'bold 40px "Times New Roman", Times, serif';
    p_document.getElementById(l_init_elements.sectionHello).classList.remove(l_init_hidden);
  l_context.fillText('Hello, World!', 35, 43);
    p_document.getElementById(l_init_elements.sectionForm).classList.add(l_init_hidden);
}());
  };
</source>
</source>
==Quellen==
<references/>
<ol start ="6">
<li> {{Quelle|Kowarschick, W.: Multimedia-Programmierung}}</li>
<li> http://www.html5canvastutorials.com/tutorials/html5-canvas-element/ HTML5 Canvas Text Tutorial]</li>
</ol>
==Siehe auch==
==Siehe auch==
* {{SieheAuch|Pilgrim (2011)}}
* {{SieheAuch|Pilgrim (2011)}}
* [http://www.w3schools.com/html/html5_intro.asp w3schools.com: HTML5]
* [http://www.w3schools.com/html/html5_intro.asp w3schools.com: HTML5]
* [https://html.spec.whatwg.org/ HTML Living Standard]
* [https://html.spec.whatwg.org/ HTML Living Standard]
==Fortsetzung des Tutoriums==
Sie sollten nun [[HTML5-Tutorium: Canvas: Hello World 02|Teil 2 des Tutoriums]] bearbeiten.
[[Kategorie: HTML5-Tutorium: Canvas: Hello World]][[Kategorie: HTML5-Beispiel]][[Kategorie:Kapitel:Multimedia-Programmierung:Beispiele]]

Version vom 26. Oktober 2016, 17:21 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen:

Korrektheit: 4
(großteils überprüft)
Umfang: 4
(unwichtige Fakten fehlen)
Quellenangaben: 5
(vollständig vorhanden)
Quellenarten: 5
(ausgezeichnet)
Konformität: 4
(sehr gut)

HTML-Tutorium Hello World: JavaScript | Canvas | SVG

Inhalt | Teil 1 | Teil 2

Musterlösung: index.html (SVN-Repository) hzuführen.[1]

Use Cases

Wie im dritten und vierten Teil des Hello-World-Tutoriums soll die ganze der Name des Benutzers erfragt werden, bevor er persönlich begrüßt wird.

Die Ausgabe erfolgt wie im ersten Teil des Canvas-Tutoriums mit Hilfe eines Canvas-Elements.

Die Anwendung soll wie „App5“ des vierten Teils des Hello-World-Tutoriums aufgebaut sein:

  • Die Initialisierungsinformationen werden aus JSON-Dateien eingelesen.
  • Die Anwendung wird mit Hilfe von RequireJS modularisiert.

Erstellen eines neuen Projektes

Erstellen Sie ein neues Projekt „HelloWorldCanvas02“. Kopieren Sie anschließend Datei „index5.html“ sowie die Ordner „web/css“, „web/init“, „web/js/app5“ , „web/js/lib/require“ und die Datei „web/js/main5.js“ aus dem vierten Teil des Tutoriums zusammen mit den darin enthaltenen Dateien in Ihr Projekt.

Nehmen Sie folgende Umbenennungen vor (smartes Refactoring):

  • index5.htmlindex.html
  • js/main5.jsjs/main.js
  • js/app5js/app

Vergessen Sie nicht, dass Sie in der Datei „index.html“ den Befehl

<script data-main="js/main5" src="js/lib/require/require.js"></script>

durch

<script data-main="js/main" src="js/lib/require/require.js"></script>

ersetzen müssen. Und in der Konfigurationsanweisung von RequireJS ( Datei „main.js“) müssen sie app: 'app5' entweder entfernen oder durch app: 'app' ersetzen. Den Eintrag wk: 'lib/wk_amd' benötigen Sie auch nicht mehr (außer wenn Sie meine JSON-Bibliothek an Stelle der des RequireJS-JSON-Plugins verwenden möchten).

Passen Sie zu guter Letzt den Titel in der HTML-Datei „index.html“ an.

Wenn Sie alles richtig gemacht haben, sollte jetzt der Code der ursprünglichen App5-Anwendung wieder laufen.

Jetzt müssen Sie nur noch wenige Veränderungen am Code vornehmen, um die Ausgabe auf eine Canvas-Ausgabe umzustellen.

index.html

Ersetzen Sie Hello-Section-Elemente Ihrer HTML-Datei durch folgende Section-Element:

<section id="section1_hello" class="hidden">
  <canvas id="canvas1">
    Unfortunately, your browser doesn't support HTML5!
  </canvas>
</section>

und

<section id="section2_hello" class="hidden">
  <canvas id="canvas2">
  </canvas>
</section>

Dieser Schritt war in ähnlicher Form schon im ersten Teil des Canvas-Tutoriums notwendig.

hello_de.json und hello_en.json

Die Initialisierungs-Dateien „hello_de.json“ und „hello_en.json“ müssen an die neuen Gegebenheiten angepasst werden. Elemente, die es nicht mehr gibt – "hello" und "welcome" –, müssen entfernt werden, neue Elemente – "canvas" – müssen eingefügt werden und Initialwerte für da Canvas-Element (Höhe, Breit, Fontangaben etc.) müssen ergänzt werden.

Beispielsweise sieht die Datei „hello_de.json“ nun folgendermaßen aus:

{
  "HTMLElements":
  {
    "sectionForm":    "section2_form",
    "headingForm":    "heading2_form",
    "inputNameLabel": "label2_name",
    "inputName":      "input2_name",
    "buttonReset":    "button2_reset",
    "buttonSubmit":   "button2_submit",
    "sectionHello":   "section2_hello",
    "canvas":         "canvas2"
  },

  "text":
  {
    "title":   "Hello, Stranger!",
    "query":   "What's your name?",
    "reset":   "Reset",
    "submit":  "Say hello",
    "hello":   "Hello, $1!"
  },

  "css":
  {
    "hidden": "hidden"
  },

  "canvas":
  {
    "width":  500,
    "height":  60,
    "font":   "bold 40px \"Times New Roman\", Times, serif",
    "hello_x": 35,
    "hello_y": 43
  }
}

greet.js

Zu guter Letzt muss noch die Methode „sayHello“ in der Datei „greet.js“ angepasst werden. Diese Methode soll nicht mehr den DOM-Baum manipulieren, sondern den Gruß in das Ihr übermittelte Canvas-Element schreiben. Alle übrigen Methoden werden nicht verändert.

Die Methode „sayHello funktioniert im Prinzip genauso wie die Initialisierungsfunktion im ersten Teil des Tutoriums. Nur werden jetzt keine konstanten Werte mehr zum Initialisieren des Canvas verwendet, sondern Werte, die im Parameter „p_init“ übermittelt wurden:

l_this.sayHello =
  function ()
  {
    var l_init_elements = p_init.HTMLElements,
        l_init_text     = p_init.text,
        l_init_hidden   = p_init.css.hidden,
        l_init_canvas   = p_init.canvas,
        l_name          = p_document.getElementById(l_init_elements.inputName).value,
        l_canvas        = p_document.getElementById(l_init_elements.canvas),
        l_context       = l_canvas.getContext('2d');

    l_canvas.width  = l_init_canvas.width;
    l_canvas.height = l_init_canvas.height;
    l_context.font  = l_init_canvas.font;

    l_context.fillText(l_init_text.hello.replace('$1', l_name), l_init_canvas.hello_x, l_init_canvas.hello_y);

    p_document.getElementById(l_init_elements.sectionHello).classList.remove(l_init_hidden);
    p_document.getElementById(l_init_elements.sectionForm).classList.add(l_init_hidden);
  };

Siehe auch