2009-07-13 16 views
2

Es gibt tausend Artikel, wie man LineBreakMeasurer verwendet, um mehrzeiligen Text zu zeichnen, aber es gibt nichts über das Zeichnen mehrzeiligen Textes unter Berücksichtigung auch \ n (wenn Sie eine neue Zeile zu einem bestimmten zwingen wollen) Position im Text und nicht nur, wenn der rechte oder linke Rand endet).Handhabung n in LineBreakMeasurer

Das Geheimnis scheint in BreakIterator zu liegen, aber ich konnte keine Implementierung finden, die \ n behandelt.

Antwort

2

Token Sie zuerst den Text, und wenden Sie dann den LineBreakMeasureCode auf jedes Token an.

+1

Dies ist eine Möglichkeit, aber ich möchte eine Lösung, die nur LineBreakerMeasurer verwendet. –

2

Verwenden Sie anstelle der LineBreakMeasurer Methode (LBM) nextLayout(float) die überladene Methode LBM.nextLayout(float, int, boolean). Dies ermöglicht es Ihnen, den Text einzuschränken, den LBM in der zurückgegebenen TextLayout enthalten wird. In Ihrem Fall werden Sie es anweisen, nicht über den nächsten Zeilenumbruch hinauszugehen.

Dieses Code-Snippet sollte Ihnen die Idee geben. Verwenden Sie zuerst LBM.nextOffset, um zu sehen, welcher Zeichenindex das Ende des nächsten Layouts wäre. Wiederholen Sie dann den String-Inhalt bis zu diesem Offset, um zu sehen, ob Sie Zeilenumbrüche finden. Wenn Sie das tun, dann verwenden Sie diese gefunden Grenze als das zweite Argument zu nextLayout(float, int, boolean) die LBM erzählen nicht die Newline überschreiten:

int next = lineMeasurer.nextOffset(formatWidth); 
int limit = next; 
if (limit < totalLength) { 
    for (int i = lineMeasurer.getPosition(); i < next; ++i) { 
     char c = string.charAt(i); 
     if (c == '\n') { 
     limit = i; 
     break; 
     } 
    } 
} 

TextLayout layout = lineMeasurer.nextLayout(formatWidth, limit, false); 

Referenzen

http://java.sun.com/developer/onlineTraining/Media/2DText/style.html#layout http: //java.sun. com/developer/onlineTraining/Medien/2DText/Code/LineBreakSample.java

+0

Ein paar Probleme mit diesem Code, also habe ich eine Version veröffentlicht, die für mich funktioniert. –

1

Ich finde, dass dieser Code gut für das Newline-Problem funktioniert. Ich habe Atdixon als Vorlage benutzt, um das zu erreichen.

while (measurer.getPosition() < paragraph.getEndIndex()) { 
    next = measurer.nextOffset(wrappingWidth); 
    limit = next; 
    charat = tested.indexOf('\n',measurer.getPosition()+1); 
    if(next > (charat - measurer.getPosition()) && charat != -1){ 
     limit = charat - measurer.getPosition(); 
    } 
    layout = measurer.nextLayout(wrappingWidth, measurer.getPosition()+limit, false); 
    // Do the rest of your layout and pen work. 
} 
1

Aarons Code nicht immer richtig so hier funktioniert ist ein Code gezwickt, die für mich funktioniert:

int next = measurer.nextOffset(width); 
int limit = next; 
if (limit <= text.length()) { 
    for (int i = measurer.getPosition(); i < next; ++i) { 
    char c = text.charAt(i); 
    if (c == '\n') { 
     limit = i + 1; 
     break; 
    } 
    } 
} 
TextLayout textLayout = measurer.nextLayout(width, limit, false); 

Wenn Sie Text aus einem AttributedString benötigen, können Sie genau dies tun vorher

AttributedCharacterIterator iterator = attributedString.getIterator(); 
StringBuilder stringBuilder = new StringBuilder(iterator.getEndIndex()); 
while (iterator.getIndex() < iterator.getEndIndex()) { 
    stringBuilder.append(iterator.current()); 
    iterator.next(); 
} 
String text = stringBuilder.toString();