Déjà-vu! Kennt ihr das? Vor ca 2. Wochen brauchte ich ein Skript, was mir in Java bzw. Android diverse Texte in ein Viereck schreibt. Heute brauch ich das Ding in Javascript-.-„
Zum Glück hab ich was auf dem Kasten und kann das Skript portieren. Erstaunlicherweise ging das echt gut…
Es geht also wieder um Canvas, speziell wie man einen Text ein- oder mehrzeilig in ein Rechteck schreiben kann.
Um was es geht ist hoffentlich klar. Ein x beliebiger Text muss in ein Viereck rein.
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
context.fillStyle = "#FF0000";
// Text
context.fillRect(300, 100, 200, 100);
context.fillStyle = "#000000";
context.font="20px Georgia";
// errechnet sich aus der Font groesse + Padding!!!
var lineHeight = 20 + 2;
var text = "teststsllllllllllllllllllllllllllllllllllllllllllllllllllllllllggggggggggggggggggggggggglllllllfsjkfs sdf khg skghk sghsd g ";
var maxWidth = 200; // siehe oben
var maxHeight= 100; // siehe oben
var maxZeilenAnz = Math.floor(maxHeight / lineHeight);
var ergList = [];
var zeiger = 0;
for (var i = 0; i < maxZeilenAnz; i++) {
var zeile = "";
var zulang = false;
while (!zulang && zeiger < text.length) {
var tmpZzeile = zeile + text.charAt(zeiger);
var lineHeightTmp = context.measureText(tmpZzeile);
if(lineHeightTmp.width > maxWidth){
zulang = true;
// falls es zu lang wird!
if((i == (maxZeilenAnz - 1)) && zeile.length > 4){
zeile = zeile.substring(0, zeile.length - 3) + "...";
}else{
// schauen ob ein Leerzeichen in der naehe ist
var posLeerz = zeile.lastIndexOf(" ");
if(posLeerz != -1 && (6 > (zeile.length - posLeerz))){
zeiger = text.substring(0, zeiger).lastIndexOf(" ") + 1;
zeile = zeile.substring(0, posLeerz);
}
}
}else{
zeile = tmpZzeile;
zeiger++;
}
}
if(zeile != ""){
ergList.push(zeile);
}
if(zeiger > text.length){
break;
}
}
// Achtung Y koordinate von oben!
var tempY = 100 + lineHeight;
for (var i = 0; i < ergList.length; i++) {
var item = ergList[i];
// Achtung x koordinate von oben!
context.fillText(item ,300, tempY);
tempY = tempY + lineHeight;
}
Copyright © 2015 AxxG – Alexander Gräsel
Kommentar verfassen