2012-10-16 17 views
9

私はsimular問題を扱う多くのスレッドを見てきましたが、それらのどれも私のために働いていません。キャンバスでは、サイズが200x200pxの四角形で、この矩形にテキストを書きたいと思っています。テキストはすべての矩形を塗りつぶす必要はありませんが、重要なことは、矩形の終わりに達すると自動的に改行が行われることです。どのように私はアンドロイドでこれを行うことができますか?Androidプログラミング:長方形に複数行テキストを描画するにはどうすればよいですか?

ありがとうございました!

+0

私はあなたが簡単に.ITはあなたの目的に合っ行うと「fill_parent」にあなたのTextViewの幅と高さを設定できるカスタムレイアウト内のTextViewをラップするためのより良い解決策だと思う。:) – Daniel

答えて

32

のために来ています。

RectF rect = new RectF(....) 

StaticLayout sl = new StaticLayout("This is my text that must fit to a rectangle", textPaint, (int)rect.width(), Layout.Alignment.ALIGN_CENTER, 1, 1, false); 

canvas.save(); 
canvas.translate(rect.left, rect.top); 
sl.draw(canvas); 
canvas.restore(); 
+2

ありがとう!以前はStaticLayoutを一度も見たことがありませんでした。私はそれを使って自分のアプリに入っている醜いコードを整理しました。 – Simon

+0

これはこの質問に対する正解でなければなりません+1 –

+0

テキストを変更する必要がある場合は、StaticLayoutを[DynamicLayout](http://developer.android.com/reference/android/text/DynamicLayout.html)に置き換えることもできますその後。 –

3

テキストを測定し、コード内でそれを分解する必要があります。 Paint.measureTextが必要です。

0

あなたは自分のキャンバスの上にテキストフィールドを使用し、そのテキストフィールドのために複数行を可能にすることができる - あなたはテキストフィールドの改行のように行われることでしょうあなたはStaticLayoutを使用することができます無料;-)

1
public class MutilineText { 
private String mText; 
private int fontSize = 50; 


public MutilineText(String text) { 

    this.mText = text; 
} 

public String getText() { 
    return mText; 
} 

public void setText(String text) { 
    mText = text; 
} 

public void draw(Canvas canvas, Rect drawSpace) { 


    Paint paintText = new Paint(Paint.ANTI_ALIAS_FLAG); 

    paintText.setAntiAlias(true); 
    paintText.setDither(true); 
    paintText.setColor(Color.BLACK); 
    paintText.setStyle(Paint.Style.FILL); 
    paintText.setStrokeWidth(3); 
    paintText.setTextSize(fontSize); 
    drawMultilineText(mText, drawSpace.left, drawSpace.top + 15, paintText, canvas, fontSize, drawSpace); 
} 


private void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas, int fontSize, Rect drawSpace) { 
    int lineHeight = 0; 
    int yoffset = 0; 
    String[] lines = str.split("\n"); 

    lineHeight = (int) (calculateHeightFromFontSize(str, fontSize) * 1.4); 
    String line = ""; 
    for (int i = 0; i < lines.length; ++i) { 
     if (calculateWidthFromFontSize(line, fontSize) <= drawSpace.width()) { 
      canvas.drawText(line, x + 30, y + yoffset, paint); 
      yoffset = yoffset + lineHeight; 
      line = lines[i]; 
     } else { 
      canvas.drawText(divideString(line, drawSpace.width()), x + 30, y + yoffset, paint); 
     } 
    } 


} 

private String divideString(String inputString, int bound) { 
    String ret = inputString; 

    while (calculateWidthFromFontSize(ret, fontSize) >= bound) { 
     ret = ret.substring(0, (ret.length() - 1)); 
    } 
    ret = ret.substring(0, ret.length() - 3) + "..."; 

    return ret; 
} 

private int calculateWidthFromFontSize(String testString, int currentSize) { 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.width()); 
} 

private int calculateHeightFromFontSize(String testString, int currentSize) { 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.height()); 
} 
+0

コードのみで回答してください。あなたのしていることを説明するコメントを追加してください。 –

関連する問題