Created
August 28, 2011 22:27
-
-
Save ninetwentyfour/1177318 to your computer and use it in GitHub Desktop.
Write Text Anywhere With HTML5 Canvas 1 - blogpost
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
</head> | |
<body> | |
<div id="main"> | |
<canvas id="c"></canvas><!-- the canvas --> | |
</div> | |
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<style> | |
body { | |
background: #111; | |
color:#eee; | |
} | |
#c { | |
width: 640px; | |
height: 360px; | |
border:1px solid #111; | |
float:left; | |
background:#eee; | |
} | |
#main{ | |
width:650px; | |
margin:auto; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="main"> | |
<canvas id="c"></canvas><!-- the canvas --> | |
</div> | |
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script> | |
<script type="text/javascript" src="text.js"></script><!-- Library to help text --> | |
<script type="text/javascript"> | |
$('#c').mousedown(function(e){ | |
if ($('#textAreaPopUp').length == 0) { | |
var mouseX = e.pageX - this.offsetLeft + $("#c").position().left; | |
var mouseY = e.pageY - this.offsetTop; | |
//append a text area box to the canvas where the user clicked to enter in a comment | |
var textArea = "<div id='textAreaPopUp' style='position:absolute;top:"+mouseY+"px;left:"+mouseX+"px;z-index:30;'><textarea id='textareaTest' style='width:100px;height:50px;'></textarea>"; | |
var saveButton = "<input type='button' value='save' id='saveText' onclick='saveTextFromArea("+mouseY+","+mouseX+");'></div>"; | |
var appendString = textArea + saveButton; | |
$("#main").append(appendString); | |
} else { | |
$('textarea#textareaTest').remove(); | |
$('#saveText').remove(); | |
$('#textAreaPopUp').remove(); | |
var mouseX = e.pageX - this.offsetLeft + $("#c").position().left; | |
var mouseY = e.pageY - this.offsetTop; | |
//append a text area box to the canvas where the user clicked to enter in a comment | |
var textArea = "<div id='textAreaPopUp' style='position:absolute;top:"+mouseY+"px;left:"+mouseX+"px;z-index:30;'><textarea id='textareaTest' style='width:100px;height:50px;'></textarea>"; | |
var saveButton = "<input type='button' value='save' id='saveText' onclick='saveTextFromArea("+mouseY+","+mouseX+");'></div>"; | |
var appendString = textArea + saveButton; | |
$("#main").append(appendString); | |
} | |
}); | |
function saveTextFromArea(y,x){ | |
//get the value of the textarea then destroy it and the save button | |
var text = $('textarea#textareaTest').val(); | |
$('textarea#textareaTest').remove(); | |
$('#saveText').remove(); | |
$('#textAreaPopUp').remove(); | |
//get the canvas and add the text functions | |
var canvas = document.getElementById('c'); | |
var ctx = canvas.getContext('2d'); | |
var cw = canvas.clientWidth; | |
var ch = canvas.clientHeight; | |
canvas.width = cw; | |
canvas.height = ch; | |
//break the text into arrays based on a text width of 100px | |
var phraseArray = getLines(ctx,text,100); | |
// this adds the text functions to the ctx | |
CanvasTextFunctions.enable(ctx); | |
var counter = 0; | |
//set the font styles | |
var font = "sans"; | |
var fontsize = 16; | |
ctx.strokeStyle = "rgba(237,229,0,1)"; | |
ctx.shadowOffsetX = 2; | |
ctx.shadowOffsetY = 2; | |
ctx.shadowBlur = 1; | |
ctx.shadowColor = "rgba(0,0,0,1)"; | |
//draw each phrase to the screen, making the top position 20px more each time so it appears there are line breaks | |
$.each(phraseArray, function() { | |
//set the placement in the canvas | |
var lineheight = fontsize * 1.5; | |
var newline = ++counter; | |
newline = newline * lineheight; | |
var topPlacement = y - $("#c").position().top + newline; | |
var leftPlacement = x - $("#c").position().left; | |
text = this; | |
//draw the text | |
ctx.drawText(font, fontsize, leftPlacement, topPlacement, text); | |
ctx.save(); | |
ctx.restore(); | |
}); | |
//reset the drop shadow so any other drawing don't have them | |
ctx.shadowOffsetX = 0; | |
ctx.shadowOffsetY = 0; | |
ctx.shadowBlur = 0; | |
ctx.shadowColor = "rgba(0,0,0,0)"; | |
} | |
function getLines(ctx,phrase,maxPxLength) { | |
//break the text area text into lines based on "box" width | |
var wa=phrase.split(" "), | |
phraseArray=[], | |
lastPhrase="", | |
l=maxPxLength, | |
measure=0; | |
ctx.font = "16px sans-serif"; | |
for (var i=0;i<wa.length;i++) { | |
var w=wa[i]; | |
measure=ctx.measureText(lastPhrase+w).width; | |
if (measure<l) { | |
lastPhrase+=(" "+w); | |
}else { | |
phraseArray.push(lastPhrase); | |
lastPhrase=w; | |
} | |
if (i===wa.length-1) { | |
phraseArray.push(lastPhrase); | |
break; | |
} | |
} | |
return phraseArray; | |
} | |
</script> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#c { | |
width: 640px; | |
height: 360px; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//steal the mousedown event for the canvas for one time - you can use a regular click if you want - this was to interact with some other code in my project | |
$('#c').mousedown(function(e){ | |
if ($('#textAreaPopUp').length == 0) { | |
var mouseX = e.pageX - this.offsetLeft + $("#c").position().left; | |
var mouseY = e.pageY - this.offsetTop; | |
//append a text area box to the canvas where the user clicked to enter in a comment | |
var textArea = "<div id='textAreaPopUp' style='position:absolute;top:"+mouseY+"px;left:"+mouseX+"px;z-index:30;'><textarea id='textareaTest' style='width:100px;height:50px;'></textarea>"; | |
var saveButton = "<input type='button' value='save' id='saveText' onclick='saveTextFromArea("+mouseY+","+mouseX+");'></div>"; | |
var appendString = textArea + saveButton; | |
$("#main").append(appendString); | |
} else { | |
$('textarea#textareaTest').remove(); | |
$('#saveText').remove(); | |
$('#textAreaPopUp').remove(); | |
var mouseX = e.pageX - this.offsetLeft + $("#c").position().left; | |
var mouseY = e.pageY - this.offsetTop; | |
//append a text area box to the canvas where the user clicked to enter in a comment | |
var textArea = "<div id='textAreaPopUp' style='position:absolute;top:"+mouseY+"px;left:"+mouseX+"px;z-index:30;'><textarea id='textareaTest' style='width:100px;height:50px;'></textarea>"; | |
var saveButton = "<input type='button' value='save' id='saveText' onclick='saveTextFromArea("+mouseY+","+mouseX+");'></div>"; | |
var appendString = textArea + saveButton; | |
$("#main").append(appendString); | |
} | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var mouseX = e.pageX - this.offsetLeft + $("#c").position().left; | |
var mouseY = e.pageY - this.offsetTop; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function saveTextFromArea(y,x){ | |
//get the value of the textarea then destroy it and the save button | |
var text = $('textarea#textareaTest').val(); | |
$('textarea#textareaTest').remove(); | |
$('#saveText').remove(); | |
//get the canvas and add the text functions | |
var canvas = document.getElementById('c'); | |
var ctx = canvas.getContext('2d'); | |
var cw = canvas.clientWidth; | |
var ch = canvas.clientHeight; | |
canvas.width = cw; | |
canvas.height = ch; | |
//break the text into arrays based on a text width of 100px | |
var phraseArray = getLines(ctx,text,100); | |
// this adds the text functions to the ctx | |
CanvasTextFunctions.enable(ctx); | |
var counter = 0; | |
//set the font styles | |
var font = "sans"; | |
var fontsize = 16; | |
ctx.strokeStyle = "rgba(237,229,0,1)"; | |
ctx.shadowOffsetX = 2; | |
ctx.shadowOffsetY = 2; | |
ctx.shadowBlur = 1; | |
ctx.shadowColor = "rgba(0,0,0,1)"; | |
//draw each phrase to the screen, making the top position 20px more each time so it appears there are line breaks | |
$.each(phraseArray, function() { | |
//set the placement in the canvas | |
var lineheight = fontsize * 1.5; | |
var newline = ++counter; | |
newline = newline * lineheight; | |
var topPlacement = y - $("#c").position().top + newline; | |
var leftPlacement = x - $("#c").position().left; | |
text = this; | |
//draw the text | |
ctx.drawText(font, fontsize, leftPlacement, topPlacement, text); | |
ctx.save(); | |
ctx.restore(); | |
}); | |
//reset the drop shadow so any other drawing don't have them | |
ctx.shadowOffsetX = 0; | |
ctx.shadowOffsetY = 0; | |
ctx.shadowBlur = 0; | |
ctx.shadowColor = "rgba(0,0,0,0)"; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//break the text into arrays based on a text width of 100px | |
var phraseArray = getLines(ctx,text,100); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// this adds the text functions to the ctx | |
CanvasTextFunctions.enable(ctx); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//draw each phrase to the screen, making the top position 20px more each time so it appears there are line breaks | |
$.each(phraseArray, function() { | |
//set the placement in the canvas | |
var lineheight = fontsize * 1.5; | |
var newline = ++counter; | |
newline = newline * lineheight; | |
var topPlacement = y - $("#c").position().top + newline; | |
var leftPlacement = x - $("#c").position().left; | |
text = this; | |
//draw the text | |
ctx.drawText(font, fontsize, leftPlacement, topPlacement, text); | |
ctx.save(); | |
ctx.restore(); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function getLines(ctx,phrase,maxPxLength) { | |
//break the text area text into lines based on "box" width | |
var wa=phrase.split(" "), | |
phraseArray=[], | |
lastPhrase="", | |
l=maxPxLength, | |
measure=0; | |
ctx.font = "16px sans-serif"; | |
for (var i=0;i<wa.length;i++) { | |
var w=wa[i]; | |
measure=ctx.measureText(lastPhrase+w).width; | |
if (measure<l) { | |
lastPhrase+=(" "+w); | |
}else { | |
phraseArray.push(lastPhrase); | |
lastPhrase=w; | |
} | |
if (i===wa.length-1) { | |
phraseArray.push(lastPhrase); | |
break; | |
} | |
} | |
return phraseArray; | |
} |
refer this for text.js
http://oldstatic.travisberry.com/demos/canvas-text-demo/text.js
The old text is overwritten each time - you can only have the text from one textarea on the screen at a time. Is there a way to remedy this?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I need text.js