2

キャンバスに大量のテキストを描画しています。テキストを設定できますが、すべてのテキストが1行で表示されているため、すべてのテキストを読み取ることができません。テキストを次のように設定したいキャンバス上の段落。誰かがこの機能を実行するためのアプローチを教えてもらえますか。

getLineCount()、getLineBound()を使用しようとしましたが、ビューにこれらのメソッドが含まれていないため、これらの行でエラーが発生します。

4

1 に答える 1

2

キャンバスの幅に収まる最長の部分文字列を見つけて、「長い」文字列全体が小さな文字列に分割されるまでこれを繰り返す必要がある場合があります。ここで再帰が役立ちます

次のようなことを試すことができます:

class Font
{
    private TextPaint tp = new TextPaint();
    private Paint p = new Paint();

    int getCharWidth(char ch, int fontSize)
    {
        tp.setTextSize(fontSize);
        Rect r = new Rect();
        tp.getTextBounds(String.valueOf(ch), 0, 1, r);
        return r.width();
    }

    int getHeight(int fontSize)
    {
        tp.setTextSize(fontSize);
        Rect r = new Rect();
        tp.getTextBounds(String.valueOf('A'), 0, 1, r);
        return r.height();
    }

    int getStringWidth(String str, int fontSize)
    {
        p.setTextSize(fontSize);
        tp.setTextSize(fontSize);
        Rect r = new Rect();
        tp.getTextBounds(str, 0, str.length(), r);          
        return r.width();//you may also try p.measureText(str);
    }
}

public String getLongestSubString(int width, int fontSize, String text)
{   
    int maxCharPerLine = width / (new Font()).getCharWidth('A', fontSize);
    int stringWidth = (new Font()).getStringWidth(text, fontSize);
    int posOfSpace = text.lastIndexOf(' ');
    if( stringWidth <= width || maxCharPerLine >= text.length())
        return text;
    String temp = text.substring(0, (posOfSpace == -1) ? (maxCharPerLine > text.length() ? text.length() : maxCharPerLine) : posOfSpace);
    return getLongestSubString(width, fontSize, temp);
}

public ArrayList<String> breakTextToLines(int width, int fontSize, String text)
{
    if(text == null)
        return null;
    ArrayList<String> lines = new ArrayList<String>();

    text = text.replace("\n", " ");

    int length = -1;
    String tempText = "";

    do
    {
        if( !tempText.endsWith(" ") && tempText.length() > 0)
            length += tempText.length();
        else
            length += tempText.length() + 1;

        if( length >= text.length())
            break;

        tempText = getLongestSubString(width, fontSize, text.substring(length));
        lines.add(tempText);
    }
    while(length < text.length());

    return lines;
}

文字列のリストを(メソッドを使用してbreakTextToLines(int,int,String))キャンバス内に収まる小さな文字列に分割したら、次のような描画プロセスを開始できます

int fontSize = 20;
float lineSpaceFactor = 0.5f;
int lineHeight = (new Font()).getHeight(fontSize);
int lineSpace = (int)(lineSpaceFactor * lineHeight);

int width = 256;//your canvas width can go here
int height = 256;//your canvas height can go here
String string = "Need a lengthy string? why not Dr Zoidberg maybe? woop woop woop!!!";//your lengthy string can go here
Canvas canvas = new Canvas(bitmap);//your canvas or bitmap source goes here
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextAlign(Align.CENTER);
paint.setTextSize(fontSize);

ArrayList<String> lines = breakTextToLines(width, fontSize, string);
int numOfLines = lines.size();
int overallHeight = numOfLines * (lineHeight + lineSpace);

int yLoc = (height - overallHeight) / 2;
yLoc += lineSpace;

for(String line : lines)
{
    int xLoc = textureWidth /2 ;       
    canvas.drawText(text, xLoc, yLoc, paint);

    yLoc += (lineHeight + lineSpace);       
}
//your canvas would now be drawn with the paragraph broken into lines and centre aligned 

お役に立てれば。

于 2013-03-12T12:56:35.370 に答える