Voor een nieuwe opdracht wilde ik gebruik gaan maken van de canvas tag. Hierin wilde ik middels javascript elementen gaan tekenen om bepaalde data weer te geven. Een simpele voorstelling: horizontaal een aantal aanklikbare bolletjes met daartussen lijntjes.
Niet zo heel moeilijk, ik was nog niet bekend met hoe je in een canvas kan tekenen, maar daar is genoeg over te vinden, uiteraard. Nu schetst mijn verbazing eigenlijk dat het tekenen erg lineair is: je hebt een huidige kleur die je instelt, vervolgens teken je iets en "zet je dat op papier". Ik wil Photoshop met al haar lagen, en ik krijg MS Paint.. zo voelt het althans
Ik had eigenlijk verwacht dat je een cirkel kon toevoegen als zijnde een object binnen de canvas.
Pseudo-code:
Again, puur uit mijn hoofd gebaseerd-op-niks pseudo-code. Dit is dus een voorbeeldje van wat had verwacht voordat ik hier mee bezig ging.
Wat ik wil bereiken is dat men op een rondje kan klikken (dus NIET op de transparante corners) waarna deze groter wordt en van kleur verandert.
Alternatieven (helaas niet in dit geval) zijn Flash of Silverlight, echter.. beiden zijn geen optie vanwege de aversie die ik persoonlijk * heb jegens deze plugins, en de aankomende "oorlog" waar Apple zich ook in lijkt te willen mengen staat me ook niet aan. Daarnaast kan de eindgebruiker deze software niet altijd installeren. Ook kan ik gebruik maken van CSS3 zijn corner-radius mogelijkheid om rondjes te simuleren; dit heeft echter als nadeel dat een HTML element wat eruit ziet als een rondje altijd nog een rechthoek (of vierkant) is, de hoeken zullen dus ook onclick en onmouseover events afvangen.
Je zou zeggen dat SVG (mits je de namespace opneemt in je HTML namespace) inline binnen je HTML zou moeten werken, alleen ik krijg dit niet werkende. Ook op W3Schools staat dit omschreven als een "I wish.." onderdeel.
Het W3C lijkt er wel mee bezig te zijn, maar dit werkt in de doel-browser (Firefox) nog niet.
Het wordt overigens wel in Firefox 4 ingebakken, alleen laat die release nog even op zich wachten.
De enige oplossing die ik kan bedenken is de onclick en onmouseover events te simuleren door de X en Y coordinaten simpelweg in de canvas zelf af te vangen, en bij te houden welke coordinaten "hit areas" zijn. Zodra de muis binnen deze areas komt zou ik de complete canvas opnieuw tekenen met alleen de huidige "hit area" gehighlight. Dit lijkt me niet alleen best veel werk, maar ook redelijk zwaar mits je dit op een ondervoed Citrix machientje moet verrichten.
Kortom: Heb ik nog andere opties?
* Ik vind Actionscript ronduit ranzig en Silverlight heb ik een jaar geleden het een en ander mee gedaan, backwards compatibility bestond niet en de ontwikkeltools waren zelf zo brak als ikzelf zaterdagochtend ben.
Niet zo heel moeilijk, ik was nog niet bekend met hoe je in een canvas kan tekenen, maar daar is genoeg over te vinden, uiteraard. Nu schetst mijn verbazing eigenlijk dat het tekenen erg lineair is: je hebt een huidige kleur die je instelt, vervolgens teken je iets en "zet je dat op papier". Ik wil Photoshop met al haar lagen, en ik krijg MS Paint.. zo voelt het althans
Ik had eigenlijk verwacht dat je een cirkel kon toevoegen als zijnde een object binnen de canvas.
Pseudo-code:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
| var canvas = document.getElementById("canvashier"); canvas.setDrawMode = "2d"; var rondje = canvas.createCircle(5, 5, 5, Math.pi*2); rondje.fill = "#000333"; // simpele hex of rgb/rgba/cmyk etc waarden rondje.stroke = "1px solid #aabb33"; // zoals in css rondje.paint(20, 20); // x en y coordinaten rondje.onClick = function() { this.fill = "#9313aa"; this.width = "10px"; this.height = "10px"; } |
Again, puur uit mijn hoofd gebaseerd-op-niks pseudo-code. Dit is dus een voorbeeldje van wat had verwacht voordat ik hier mee bezig ging.
Wat ik wil bereiken is dat men op een rondje kan klikken (dus NIET op de transparante corners) waarna deze groter wordt en van kleur verandert.
Alternatieven (helaas niet in dit geval) zijn Flash of Silverlight, echter.. beiden zijn geen optie vanwege de aversie die ik persoonlijk * heb jegens deze plugins, en de aankomende "oorlog" waar Apple zich ook in lijkt te willen mengen staat me ook niet aan. Daarnaast kan de eindgebruiker deze software niet altijd installeren. Ook kan ik gebruik maken van CSS3 zijn corner-radius mogelijkheid om rondjes te simuleren; dit heeft echter als nadeel dat een HTML element wat eruit ziet als een rondje altijd nog een rechthoek (of vierkant) is, de hoeken zullen dus ook onclick en onmouseover events afvangen.
Je zou zeggen dat SVG (mits je de namespace opneemt in je HTML namespace) inline binnen je HTML zou moeten werken, alleen ik krijg dit niet werkende. Ook op W3Schools staat dit omschreven als een "I wish.." onderdeel.
Het W3C lijkt er wel mee bezig te zijn, maar dit werkt in de doel-browser (Firefox) nog niet.
Het wordt overigens wel in Firefox 4 ingebakken, alleen laat die release nog even op zich wachten.
De enige oplossing die ik kan bedenken is de onclick en onmouseover events te simuleren door de X en Y coordinaten simpelweg in de canvas zelf af te vangen, en bij te houden welke coordinaten "hit areas" zijn. Zodra de muis binnen deze areas komt zou ik de complete canvas opnieuw tekenen met alleen de huidige "hit area" gehighlight. Dit lijkt me niet alleen best veel werk, maar ook redelijk zwaar mits je dit op een ondervoed Citrix machientje moet verrichten.
Kortom: Heb ik nog andere opties?
* Ik vind Actionscript ronduit ranzig en Silverlight heb ik een jaar geleden het een en ander mee gedaan, backwards compatibility bestond niet en de ontwikkeltools waren zelf zo brak als ikzelf zaterdagochtend ben.
[ Voor 9% gewijzigd door Blue-eagle op 12-05-2010 00:21 ]