Juni 05 2008

Bill Gates: IE8 Beta 2 kommt im August

Tag: TrendsPatrick @ 7:54 p.m.

Wie die Kollegen von InfoWorld.com berichten, sprach der abgetretene Microsoft-Guru Bill Gates anläßlich der derzeit in Orlando (Florida) stattfindenden TechEd Developers Conference unter anderem über die Entwicklung des hauseigenen Browsers Internet Explorer.

So sieht Gates den IE als Aushängeschild Microsofts in Sachen Web-Technologien. Es gesteht jedoch ein, dass Mozillas Firefox dem Internet Explorer schwer zusetzte, aber letztlich dazu beitrug die Entwicklung des MS-Browsers voranzutreiben und das eigene Produkt ingesamt innovativer zu gestalten.

Außerdem kündigt Gates an, dass die zweite Beta des kommenden IE8 noch im August diesen Jahres erscheinen wird. Welche Überraschungen und Features Microsoft in den neuen Sprößling hat einfließen lassen, wurde leider nicht verraten.


Juni 03 2008

Bildbearbeitung im Browser

Tag: Canvas,JavascriptPatrick @ 4:16 p.m.

Der Däne Jacob Seidelin hat heute auf seiner Spielwiese http://www.nihilogic.dk/ die nächste beeindruckende Demonstration der Möglichkeiten, die Canvas bietet, aufgezeigt.

Nachdem Seidelin zuletzt vor allem an Umsetzungen von Spieleklassikern arbeitete, veröffentlichte er diesmal ein Online-Bildbearbeitungs-Tool namens Pixastic, das nur clientseitig im Browser läuft.

Pixatic ist kein vollständiges Bildbearbeitungsprogramm, das alle erdenkbaren Fotomanipulationsmöglichkeiten bietet, und soll auch niemals Adobe’s Photoshop und ähnliche Programme ablösen. Das Tool soll nur zeigen, was mit modernen Browser auf Grundlage von Canvas und Javascript alles erreicht werden kann, und grundlegende Funktionen zur schnellen, clientseitigen Bildbearbeitung bereit stellen.

Hinter einer primitiv gehaltenen Benutzeroberfläche (GUI) verbergen sich die üblichen Methoden zur Fotomanipulation wie Ausschneiden, Größe verändern und Drehen genauso wie einige Filter- und Effektfunktionen wie zum Beispiel das Anpassen von Helligkeit, Kontrast, Sättigung, Graustufen, Unschärfe und so weiter.

Mit einigen Einschränkungen läuft das Pixastic auf allen modernen Browser, wobei erhebliche Unterschiede bezüglich der Geschwindigkeit auftreten können. Opera 9.5 (Beta), Firefox 3 und die aktuellen nightly builds des WebKit bieten die beste Performance. Der Internet Explorer bleibt wegen fehlender Canvas-Unterstützung außen vor.

Als Bildquelle kann man sowohl Fotos vom eigenen Rechner hochladen oder aber eine URL angeben. Unterstützt werden alle gängigen Bildformate mit einer Auflösung von bis zu 1024×1024 und einer Größe von bis zu einem Megabyte. Desweiteren besteht die Möglichkeit seine bearbeiteten Bilder auf dem eigenen Desktop abzuspeichern.

Folgende Tastenkürzel hat Seidelin integiert (in Opera sollte man stets Ctrl+Shift anstelle von nur Ctrl drücken):

  • Ctrl+C, Ctrl+X, Ctrl+V – Kopieren, Ausschneiden und Einfügen angewandt auf die ausgewählte Bildfläche
  • Ctrl+Z – Rückgängig machen (bis zu maximal der letzten 10 Aktionen)
  • Alt+Backspace / Ctrl+Backspace – einfärben der ausgewählten Bildfläche

Die ToDo-Liste für die Anwendung ist noch lang und reicht von dem Einbau einer Zoom- und Scrollfunktion über das Beheben etlicher Fehler bis hin zur Überarbeitung der gesamten Benutzeroberfläche.

An dieser Stelle möchte ich noch auf ein ähnliches Projekt namens Canvaspaint verweisen. Canvaspaint ist eine nahezu 1-zu-1-Kopie von Microsofts Paint, läuft jedoch wie Pixastic nur im Browser und bietet den selben Funktionsumfang.

CanvaspaintPixastic - Bildbearbeitung im Browser


Juni 03 2008

Foto-Slideshow und runde Ecken via DOMAssistant-Plugin

Tag: DOMAssistantPatrick @ 9:19 a.m.

Nachdem ich erst gestern über die kürzlich veröffentlichte DOMAssistant-Version 2.7.1.1 berichtet habe, möchte ich an dieser Stelle auf 2 interessante Plugins für die eben genannte Javascript-Klasse eingehen. Die beiden Erweiterungen tragen die Namen PictureSlides und boxIt.

PictureSlides bietet vielfältige Möglichkeiten Slideshows und Fotogalerien individuell zu erstellen und anzupassen. Dabei gibt es die folgenden Varianten, die man sich jeweils in einer Demo ansehen kann: nur große Bilder anzuzeigen, eine Slideshow in eine existierende Seite einzubetten und eine Fotogalerie samt Vorschau-Bildern zu erstellen.

Zu den Features zählen:

  • Slideshows, die beim Öffnen der Seite starten
  • Slideshows mit Wiederholungsschleifen
  • Lightbox-ähnlicher Effekt während des Slideshow-Durchlaufs zum Abheben vom Rest der Homepage
  • Ein- und Ausblendeffekt
  • Wahlweises Vorladen der Bilder um Ladezeiten zu umgehen
  • Individuelles Steuern, welches Foto zuerst angezeigt werden soll, über den Programmcode
  • Unterstützung von Tastaturkürzeln
  • Vor- und Zurück-Links
  • Einblenden von Text neben dem Bild
  • Bilderzähler

Dieses Plugin besteht aus zwei Dateien: Eine Datei beinhaltet den gesamten nötigen Javascript-Code, die andere enthält die Einstellungen zum Anpassen aller Parameter, Features und Werte.

Eine ausführliche Einbauanleitung samt Dokumentation steht allen Interessierten in englischer Sprache zur Verfügung.

Das zweite Plugin, das ist vorstellen möchte, trägt den Namen boxIt und ist von dem Franzosen Samuel Desnoës, der bereits für die französische Übersetzung der DOMAssistant-Dokumentation verantwortlich war, entwickelt worden.

Während Rahmen um block-artige HTML-Elemente (div, p, ul, li) standardmäßig eckig sind und man daher „runde Ecken“ meist nur über div-Verschachtelungen erzeugen kann, vereinfacht boxIt den Quellcode und damit auch das Vorgehen erheblich, indem der Anwendungsentwickler nur noch das HTML-Element angeben muss und das Plugin den Rest via Javascript hinzufügt.

Auf der Homepage des Entwicklers findet sich eine Demonstrationsseite, die aufzeigt, wie boxIt arbeitet. Ebenso existiert eine ausführliche (englischsprachige) Beschreibung über das Benutzen des Plugins.

DA-Plugin PictureSlidesRunde Ecken dank DA-Plugin


Juni 02 2008

Neues von DOMAssistant

Tag: DOMAssistantPatrick @ 8:47 p.m.

Vergangene Woche ist die DOMAssistant-Bibliothek in Version 2.7.1.1 erschienen, die 2 Fehler im Internet Explorer in Bezug auf Attribute korrigierte, die sich in das 2 Tage vorher veröffentlichte 2.7.1er Release eingeschlichen hatten.

Die Neuerungen in 2.7.1 lesen sich wie folgt:

  • Unterstützung der Pseudo-Klassen :nth-last-child, :nth-last-of-type und :target
  • Unterstützung einfacher und doppelter Kommata bei Attributwerten
  • noParse-Option für die ajax()-Funktion zum Umgehen der erzwungenen Umwandlung von GET- in POST-Parameter bei POST-Aufrufen
  • Fehlerbereinigung der setAttributes-Methode im IE
  • Fehlerbereinigung der XHTML-Namespace-Evaluation in XPath
  • addContent akzeptiert nun auch numerische Werte
  • Events können aus sich selbst heraus hinzugefügt und entfernt werden, ohne Probleme im Event-Handler zu verursachen
  • Erstellen von <object>-Elementen im Firefox funktioniert nun korrekt

Für die nächste Hauptversion planen die DA-Entwickler die Erweiterung des Event-Modells um benutzerdefinierte Ereignisse, das Einführen weiterer Möglichkeiten zur Ereignissteuerung und noch einige andere Funktionen, die Anwendungsentwicklern zu Gute kommen sollen.


Juni 01 2008

BeSlimed – Javascriptgame made in Germany

Tag: mootools,SpielePatrick @ 1:58 a.m.

Um seine Fähigkeit im Umgang mit MooTools zu verbessern, begann Markus Inger an einer BeJeweled-Umsetzung basierend auf dieser Javascript-Bibliothek zu schreiben.

Ziel des Spiels, das er BeSlimed getauft hat, ist es, wie im Original, durch Vertauschen benachbarter Blöcke in einer vorgegeben Zeit möglichst viele Punkte zu erzielen.

Um Punkte zu bekommen, müssen sich mindestens 3 Blöcke mit gleichem Motiv in einer Reihe (horizontal oder vertikal) befinden.Vertauscht werden darf sowohl von oben nach unten und links nach rechts (natürlich auch umgekehrt).

Mit steigender Levelzahl nimmt die Zahl der verschiedenen „Monster“ zu, wodurch auch der Schwierigkeitsgrad nach oben geht.

Inger will nach der Fertigstellung des Spiels an einer Variante mit größeren Motiven arbeiten. Vorher müssen jedoch noch einige Fehler im Skript behoben werden. Wer möchte kann sich gern an der Weiterentwicklung von BeSlimed beteiligen.

Und nun: Ab zum Spiel und viel Spaß.

BeSlimed


Mai 29 2008

Mit virtuellen Maschinen zu neuen Javascript-Geschwindigkeitsrekorden

Tag: TrendsPatrick @ 10:50 p.m.

In der vergangenen Woche erwähnte ich im Zusammenhang mit der Einführung von Video-Tags im Firefox die Zukunftspläne der Mozilla Foundation in Bezug auf Javascript. So planen die Entwickler in der Ende 2009 erscheinenden 4. Auflage des Alternativbrowsers Javascript als virtuelle Maschine laufen zu lassen, um so Skripte um ein vielfaches schneller ausführen zu lassen.

Jetzt meldet sich das Webkit-Lager zu diesem Thema zu Wort und stellt mit der SquirrelFish-Engine die wohl schnellste Javascript-Implemtierung vor, die – ebenso wie Mozillas künftige Tamarin-Engine – zur enormen Beschleunigung der Codeausführung auf Virtuelle Maschinen setzt. Die Entwickler des freien Browser, der von Apple im Safari verwendet wird, versprechen vollmundig von einem Geschwindigkeitszuwachs um den Faktor 4.

Es wird sicher noch etliche Zeit ins Land gehen bis SquirreFish im Safari Einzug halten wird. Dennoch kann man sehr gespannt sein, was Webkit da aus dem Hut zaubert, denn bereits die aktuell verwendete Javascript-Engine überzeugt in Geschwindigkeitstests.

Neu ist die Idee der virtuellen Maschinen nicht. So nutzt beispielsweise die Java-Plattform seit langer Zeit die hauseigene Java Virtual Machine (JVM), und auch Adobe integriete diese Technik in die neunte Flash-Generation.

Bei einer virtuellen Maschine wird der Programmcode in plattformunabhängigen Bytecode umgewandelt, der dann bei der Ausführung auf einen System in hardwarespezifischen Maschinencode übersetzt wird. Der Vorteil gegenüber einer herkömmlichen Engine liegt – ähnlich wie bei Mehrkernprozessoren und Programmen, die von mehreren Kernen Gebrauch machen – in der dynamischen Optimierung und Lastverteilung, was zu einer schnelleren und effizienteren Codebearbeitung führt.


Mai 27 2008

Super Mario Kart als Javascript-Spiel

Tag: Canvas,Javascript,SpielePatrick @ 10:51 p.m.

Jacob Seidelin kann einfach nicht genug von Mario bekommen. Nachdem er bereits ein Klempner-Abenteuer in Javascript mit Hilfe von Canvas umgesetzt hat, machte er sich nun daran, das bekannte Rennspiel Super Mario Kart zu übertragen.

Wie bereits in seinen vorherigen Spiele-Implementierungen benutzte Seidelin auch dieses Mal zur visuellen Darstellung vorrangig das Canvas-Element, das von Firefox (2 und 3), Opera (9.27), Safari (3.1.1) und den nightly builds des WebKit-Browsers, jedoch nicht von Microsofts Internet Explorer, unterstützt wird.

Da es sich abermals um eine Demo handelt, die nur andeutet, was möglich ist, muss man sich mit einigen Einschränkungen zufrieden geben. So gibt es keines der witzigen Items, keinen Rundenzähler, keine Zeitangabe und auch kein Ziel. Man kann also ewig seine Runden drehen.

Die Kollisionsabfrage ist sehr einfach gehalten. Als Hindernis gelten nur die Map-Grenzen und die farbigen Blöcken in der Karte. Gegnerische Karts sind „Luft“ – man kann durch sie hindurchfahren. Wasser und Sand stellen eben so wenig ein Problem für den Spieler dar.

Vorerst können nur drei verschiedene Fahrer (Mario, Luigi und Prinzessin Peach) und zwei unterschiedliche Strecken (Mario Circuit 1 und Donut Plains 1) ausgewählt werden.

Die Künstliche Intelligenz der anderen Fahrer wurde auch nur grundlegend integriert. Dennoch arbeitet sie zufriedenstellend.

Vor dem Spielstart kann man einige Einstellungen anpassen. So lässt sich die Bildgröße, die Bildqualität und der Render-Modus wählen. Wobei ich nur den standardmäßigen „Single Canvas“-Modus empfehlen kann, da die beim „Per-line Canvas“-Modus in jeweils einzelne Canvas-Elemente aufgesplitteten horizontalen Linien sehr viel Rechenleistung beanspruchen, wodurch das Spiel bei mir nicht mehr flüssig lief.

Die Steuerung des Karts erfolgt über die Pfeiltasten.

Genug der Worte, und nun: freie Fahrt mit Mario Kart.

Super Mario Kart mit Javascript und Canvas


Mai 22 2008

Die goldenen Regeln für schnelle Prototype-Anwendungen

Tag: PrototypePatrick @ 12:14 a.m.

Der hollänische BWL-Student und Javascript-Programmierer Thierry Schellenbach veröffentliche in seinem Mellow-Morning-Blog eine Abhandlung über geschwindigkeitsoptimiertes Entwickeln von Prototype-Anwendungen. Als Grundlage nutzte Schellenbach die Arbeiten von Joseph Smarr und Mark Wilton-Jones.

Zusammengefasst lassen sich die folgenden Tipps festhalten:

  • Vermeide die $$-Funktion zum Ansprechen von Elementen mit ids
  • Vermeide das Verwenden der bind-Funktion
  • Bevorzuge element.innerHTML gegenüber element.update() und document.createElement
  • Nutze for-Schleifen anstelle von each
  • Sei sparsam mit eval-Aufrufen
  • Sei sparsam mit try-catch-Befehlen
  • Speichere Variablen und Funktionen zwischen (Cache)
  • Führe Funktionen und Events erst dann aus, wenn sie wirklich gebraucht werden
  • Optimiere Schleifendurchläufe dahingehend, dass sie nur bei zu ändernden Elementen greifen

Mai 20 2008

Firefox 3.1 unterstützt HTML5-Videotags

Tag: TrendsPatrick @ 10:53 p.m.

Wenige Tage ist es her, da stellte die Mozilla Foundation den ersten (und wohlmöglich einzigen) Release Canidate des Firefox 3.0, der nochmals in Sachen Stabilität und Geschwindigkeit gegenüber den Betas zulegte, vor. Mit dem Erscheinen der finalen Version dürfte in den kommenden Wochen – ich gehe von spätestens Ende Juni aus – gerechnet werden. Doch bereits jetzt werfen die zukünftigen Mozillabrowser ihre Schatten in den Weiten des Web.

Noch Ende diesen Jahres steht die Version 3.1 des Firefox ins Haus. Mit an Bord ist dabei die Unterstützung des in HTML5 standardisierten Video-Tags. Dadurch wird es möglich sein Videos nativ durch den Browser, d.h. ohne Einsatz von Plugins wie Adobe Flash, wiederzugeben.

Völlig neu ist die Unterstützung durch die Browserhersteller nicht. Der Safari-Browser beherrscht den Support des neuen Video- als auch des Audio-Tags seit fast einem dreiviertel Jahr.

Uneinig sind sich die Browserentwickler jedoch über den zu verwendenden Codec. Während die Opera- und Mozilla-Fraktion auf den freien Ogg Theora-Codec setzt, nutzt das Apple-Lager den unter Lizenz stehenden H.264-Codec. Aufgrung von möglichen Softwarepatentverletzungen kann man davon ausgehen, dass Apple eine zusätzliche Unterstützung von Ogg Theora nicht implementieren wird, da sonst Klagen in Millionenhöhe auf Apple zukämen.

Mit Version 3.1 des Firefox wird auch die bereits für 3.0 versprochene Umsetzung von Cross-Site-XMLHttpRequests nachgereicht. Dadurch wird die bisher strikte Regel, dass AJAX-Anfragen nicht an fremde Webserver gesendet werden dürfen, aufgehoben. Ermöglich wird dies durch die Einführung von Access-Control Headers, die vorher prüfen, ob das Senden eines Request durch den fremden Webserver gestattet wird.

Doch damit nicht genug. Wahrscheinlich in der ersten Hälfte des Jahres 2009 wird der auf der Gecko-Engine 1.9.1 basierende Firefox 3.5 das Licht der Welt erblicken, ehe Ende 2009 gar die 4. Generation des feuerroten Browsers ansteht, die dann aber bereits die neu entwickelten Gecko-2-Render-Engine nutzt. Als große Neuerung steht dabei die Einführung einer virtuellen Maschine zur wesentlich effizienteren Javascript-Ausführung auf der Featureliste.


Mai 18 2008

Einführung in Canvas

Tag: CanvasPatrick @ 5:06 p.m.

Da ich in letzter Zeit über einige Projekte geschrieben habe, die auf Canvas beruhen, möchte ich über dessen Möglichkeiten und Funktionen in Form eines kleinen Tutorials berichten. In meinen Ausführungen orientiere ich mich an der Umsetzung im Mozilla Firefox und benutze als Grundlage die englischsprachige Dokumentation von Mozilla

Was ist Canvas, wer unterstützt es und woher kommt es?

Canvas ist ein grafisches Element, das mit HTML5 eingeführt werden wird. Mit Canvas ist es möglich Grafiken, Graphen und einfache Animationen mit Hilfe von Skript-Sprachen (vorrangig Javascript) dynamisch zu erzeugen. (Das Thema Animationen lasse ich in diesem Artikel außen vor.) Der aktuelle Spezifikationvorschlag ist auf der Seite http://www.whatwg.org einzusehen.

Das Canvas-Element wurde ursprünglich von Apple im OS X Dashboard zum skriptbasierten Erstellen von Minianwendungen (sogenannten Widgets) ins Leben gerufen und wurde somit vom hauseigenen Browser Safari unterstützt. Der Support seitens Mozilla begann mit der Gecko-Engine in Version 1.8, die im Firefox 1.5 verwendet wurde. Opera kommt ab Versionsnummer 9 mit Canvas zu recht.

Einzig der Internet Explorer (in allen Varianten) bietet keine Unterstützung des Elementes. Bisher ist dies auch nicht geplant, wie ich bereits in meinem Beitrag über die IE8-Beta erwähnte. Abhilfe schafft das ExplorerCanvas-Skript, das dem Internet Explorer die fehlende Unterstützung nachliefert.

Einbau in den Quellcode

Wie jedes andere HTML-Element wird das Canvas-Element im Quellcode eingebettet. Hierbei ist zu beachten, dass man die Ausmaße der anzuzeigenden Grafik über width und height angibt.

<canvas id="canvas1" width="400" height="100"></canvas>

Der eigentliche Canvas-Code ist in Javascript geschrieben und befindet sich im entsprechenden HTML-Tag. Es empfiehlt sich den Canvas-Code in eine Funktion zu packen, die dann nach dem Laden der Seite aufgerufen wird. Dies erreicht man durch den onload-Befehl, den man entweder direkt in HTML auf das body-Element anwendet oder per Javascript über Event-Methoden anhängt.

in HTML:

<body onload="draw();">

in Javascript:

if ( window.addEventListener ) {
addEventListener( "load", draw, false );
} else {
attachEvent( "onload", draw );
}

Im Javascript-Bereich wird die von mir draw genannte Funktion definiert.

Canvas-Methoden

Ich habe eine Demonstrationsseite erstellt, in der alle hier vorgestellten Methoden angewandt werden. Hinweis: Scheinbar nicht alle Beispiele sind im IE mit ExplorerCanvas nachvollziehbar.

Eine draw-Funktion sieht beispielsweise wie folgt aus:

function draw(){
var canvas = document.getElementById('tutorial');
if (canvas.getContext){
canvas = canvas.getContext('2d');
canvas.fillStyle = "rgb(200,0,0)";
canvas.fillRect( 10, 10, 55, 55 );
}
}

Die Abfrage nach der Funktion getContext dient dazu, festzustellen ob der Browser Canvas unterstützt und es somit zu keinen JS-Fehlern bei fehlendem Support kommt. Als erstes weist man einer Variable den Pfad zum Canvas-Element zu, in das die Grafik hineingezeichnet werden soll, und wendet dann darauf die Methode getContext(‚2d‘) an, mit der das Zeichnen eingeleitet wird.

Rechtecke und Gestaltungsmöglichkeiten

Wie man dem oberen Beispiel entnehmen kann, werden einfarbige, gefüllte Rechtecke mit der Funktion fillRect gezeichnet.

Parameter: fillRect( x-Koordinate, y-Koordinate, Breite, Höhe )

Mittels fillStyle kann man die Farbe des darzustellenden Rechtecks festlegen. Erlaubt sind die gewohnten Angaben mit Farbnamen, im rgb(a)-Format und Hexadezimalsystem.

Es ist ebenso möglich ein Rechteck nur mit Umrissen zu zeichnen. Dies wird über die Funktionen strokeRect und strokeStyle realisiert, die genauso benutzt werden können, wie die Methoden für ausgefüllte Rechtecke.

Linien und freie Formen

Das Erstellen von Linien geschieht mit der Methode lineTo, die als Parameter den Endpunkt der zu zeichnenden Gerade enthält.

Parameter: lineTo( x-Koordinate, y-Koordinate )

Um den Startpunkt der Geraden zu verlegen, nutzt man die Funktion moveTo, die ebenfalls einen x- und y-Wert als Parameter erwartet. Durch moveTo kann man sich frei im (virtuellen) „Raum“ bewegen.

Parameter: moveTo( x-Koordinate, y-Koordinate )

Um zusammengesetzte Linien zu zeichnen verwendet man die Path-Funktion, die mit beginPath eingeleitet wird. Die danach folgenden Anweisungen wie lineTo geben die Eckpunkte des Pfades an.

Mit den anschließend notierten Methoden fill oder stroke entscheidet man, ob die neu geschaffene Form ausgefüllt oder nur umrandet dargestellt werden soll. Es existiert auch eine closePath-Method zum Festlegen des Pfadendes, die bei Verwendung von fill getrost weggelassen werden kann. Hierbei werden der erste und der letzte Punkt automatisch miteinander verbunden und es ergibt sich somit eine selbstdefinierte „Form“.

Hier ein Codeschnipsel zur Verdeutlichung:

canvas.fillStyle = "rgba(0,150,0,0.7)";
canvas.beginPath();
canvas.moveTo( 50, 75 );
canvas.lineTo( 100, 125 );
canvas.lineTo( 100, 25 );
canvas.fill();

Kreise, Bögen und Kurven

Doch Canvas ist nicht nur auf Geraden und rechteckige Figuren beschränkt. Mit dem Befehl arc zeichnet man Kreise – wie bei den Rechtecken entweder umrahmt oder ausgefüllt.

Parameter: arc( x-Koordinate Kreismittelpunkt, y-Koordinate Kreismittelpunkt, Radius, Startwinkel, Endwinkel, Uhrzeigersinn [ true / false ] );

Bei Kreisen gibt es zwei Dinge zu beachten. Zum einen sind der Start- und Endwinkel in der Einheit Bogenmaß anzugeben, also nicht im Gradmaß. Der 360°-Vollwinkel ist dementsprechend 2*Math.PI. Zum anderen muss man festlegen, ob man die Winkelangaben mit oder entgegen dem Uhrzeigersinn betrachtet.

Ein gefüllter Vollkreis wird beispielsweise mit folgendem Code erzeugt:

canvas.fillStyle = "rgb(0,100,0)";
canvas.beginPath();
canvas.arc( 200, 75, 30, 0, 2*Math.PI, true);
canvas.fill();

Das Darstellen von komplexeren Kurven geschieht mit den beiden Methoden bezierCurveTo und quadraticCurveTo.

Parameter: quadraticCurveTo( x-Koordinate Kontrollpunkt, y-Koordinate Kontrollpunkt, x-Koordinate Endpunkt, x-Koordinate Endpunkt )

Parameter: bezierCurveTo(x-Koordinate Kontrollpunkt 1, y-Koordinate Kontrollpunkt 1, x-Koordinate Kontrollpunkt 2, y-Koordinate Kontrollpunkt 2, x-Koordinate Endpunkt, x-Koordinate Endpunkt )

Während bei der quadratischen Bezierkurve nur ein Kontrollpunkt zur Verlaufsbestimmung benutzt wird, werden bei der bezierCurveTo-Funktion 2 Kontrollpunkte benutzt. Jedoch ist das freie Zeichnen von Bezierkurven, also ohne visuellen Vorschau, äußert zeitaufwendig und eine Herausforderung.

Hier ein Beispiel dazu:

canvas.fillStyle = "rgb(245,0,0)";
canvas.beginPath();
canvas.moveTo( 75, 40 );
canvas.bezierCurveTo( 75, 37, 70, 25, 50, 25 );
canvas.bezierCurveTo( 20, 25, 20, 62.5, 20, 62.5 );
canvas.bezierCurveTo( 20, 80, 40, 102, 75, 120 );
canvas.bezierCurveTo( 110, 102, 130, 80, 130, 62.5 );
canvas.bezierCurveTo( 130, 62.5, 130, 25, 100, 25 );
canvas.bezierCurveTo( 85, 25, 75, 37, 75, 40 );
canvas.fill();

canvas.beginPath();
canvas.moveTo( 200, 25 );
canvas.quadraticCurveTo( 150, 25, 150, 62.5 );
canvas.quadraticCurveTo( 150, 100, 175, 100 );
canvas.quadraticCurveTo( 175, 120, 155, 125 );
canvas.quadraticCurveTo( 185, 120, 190, 100 );
canvas.quadraticCurveTo( 250, 100, 250, 62.5 );
canvas.quadraticCurveTo( 250, 25, 200, 25 );
canvas.stroke();

Weitere gestalterische Möglichkeiten

Desweiteren bietet Canvas grundlegende Funktionen zum Manipulieren der Linien und Linienübergänge.

Die Linienstärke wird über lineWidth festgelegt. Mit lineCap bestimmt man das Aussehen der Linienenden. Dazu stehen die folgenden Varianten zur Auswahl: butt (stumpf), round (abgerundet) und square (Überhang). Sowohl das Überhang als auch der Halbkreis haben eine Höhe respektive einen Radius entsprechend dem halben Wert der Linienbreite. butt entspricht dem Standardwert.

canvas.lineWidth = 15;
canvas.lineCap = "round";
canvas.beginPath();
canvas.moveTo( 110, 20 );
canvas.lineTo( 110, 130 );
canvas.stroke();

Mit lineJoin bestimmt man das Aussehen der Ecken zweier verbundener Linien. Hierbei stehen die Attribute round (abgerundet), bevel (abgeschrägt) und miter (eckig) zur Verfügung. Der default-Wert ist round.

canvas.lineJoin = "bevel";
canvas.beginPath();
canvas.moveTo( 200, 60 );
canvas.lineTo( 225, 85 );
canvas.lineTo( 250, 60 );
canvas.lineTo( 275, 85 );
canvas.lineTo( 300, 60 );
canvas.stroke();

Farbverläufe

Canvas ermöglicht Formen sowohl mit linearen als auch mit radialen Farbverläufen auszufüllen. Dazu wird einer Variable ein Verlauf zugewiesen. Die dazugehörigen Methodenaufrufe lauten createLinearGradient und createRadialGradient. Jeweils wird ein Startpunkt beziehungsweise -kreis und ein Endpunkt beziehungsweise -kreis als Parameter angeben, die den Bereich angeben, in dem der Farbverlauf sich erstreckt.

Parameter: createLinearGradient( x-Koordinate Startpunkt, y-Koordinate Startpunkt, x-Koordinate Endpunkt, y-Koordinate Endpunkt )

Parameter: createRadialGradient( x-Koordinate Mittelpunkt Startkreis, y-Koordinate Mittelpunkt Startkreis, Radius Startkreis, x-Koordinate Mittelpunkt Endkreis, y-Koordinate Endpunkt Startkreis, Radius Endkreis )

Anschließend werden die einzelnen farblichen Zwischenstufen mittels addColorStop definiert. Der Funktion fillStyle wird im Anschluß die Variable, die den Verlaufbeinhaltet, zugewiesen.

Parameter: addColorStop( Position [Werte zwischen 0-1 sind erlaubt], Farbdefinition );

Hier ein Beispiel eines Farbverlaufsskriptes:

var lingrad = canvas.createLinearGradient( 0, 0, 0, 150 );
lingrad.addColorStop( 0, "#0099cc" );
lingrad.addColorStop( 0.5, "#fff" );
lingrad.addColorStop( 0.5, "#99cc00");
lingrad.addColorStop( 1, "#0099ff");

canvas.fillStyle = lingrad;
canvas.fillRect( 10, 10, 130 ,130 );

Muster

Neben den bisher genannten Füllmöglichkeiten gibt es noch eine weitere Art die Fläche einer Form auszufüllen. Die Rede ist von Mustern, die aus gewöhnlich Bilddateien generiert werden. Dazu erstellt man zuerst ein neues Image-Objekt, weist diesem den Pfad zur zu verwendenden Grafikquelle zu und definiert eine onload-Funktion, die nach erfolgreichem Laden des Bildes mittels createPattern ein neues Muster erstellt.

Parameter: createPattern( Image-Objekt, Art der Wiederholungen )

Neben der Wiederholungsart „repeat“ gibt es – ähnlich der CSS-Eigenschaft background-repeat – weitere Varianten um beispielsweise Wiederholungen nur in x- oder y-Richtung zu erzeugen. Jedoch sind diese noch nicht implementiert.

Der folgende Javascript-Code soll das Vorgehen aufzeigen:

var img = new Image();
img.src="wallpaper.png";
img.onload = function() {
var pattern = canvas.createPattern( img, "repeat" );
canvas.fillStyle = pattern;
canvas.fillRect( 0, 0, 400, 150 );
}

Ausblick

Mozilla wird mit der Version 3.0 des Firefox-Browser, der auf der Gecko-Enging 1.9 basiert, in Sachen Gestaltungsmöglichkeiten von Canvas einen Schritt weiter gehen und das Rendern von Text erlauben. Dazu werden die folgenden mozilla-spezifischen Methoden eingeführt:

  • mozDrawText() – zeichnet Text
  • mozMeasureText() – gibt die Breite des zuzeichnenden Textes zurück
  • mozPathText() – definiert einen Textpfad
  • mozTextAlongPath() – zeichnet Text entlang eines vorher definierten Pfades

Zur Demonstrationsseite


« Vorherige SeiteNächste Seite »