Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get height of text with fixed width and get text length which fits in a frame?

well, I've managed to fit all my questions in the title. I need to break a long text in to columns/frames and layout them in to view. I've been digging for solutions for a couple of days now, but I can't find any examples or clear documentation on how to complete any of my tasks. I've seen a some mentions of StaticLayout, but I don't know how to use it properly. As for text height I've tried TextPaint's getTextBounds method, but it doesn't have width limit and it looks like it measures only single line (well, maybe I was doing something wrong).

Maybe someone has an example of StaticLayout or it's subclass usage?

Everything looks so simple "on paper": create "frame", check how much characters fits in it, fill frame and position it, repeat until end of text and yet I can't find anything on how to do this :)

like image 336
sniurkst Avatar asked Dec 01 '10 08:12

sniurkst


1 Answers

I don't know the exact answer to your question, but generally you can calculate the width and height of a text based on the font type and size using methods available in the graphical library.

I've done it in C# and Java. in C# it's called "MeasureString", and in Java, "FontMetrics".

EDIT:

See if this code is useful ( I haven't compiled it because I don't have android SDK here):

    String myText="";       
    String tempStr="";

    int startIndex=0;
    int endIndex=0;

    //calculate end index that fits
    endIndex=myPaint.breakText(myTest, true, frameWidth, null)-1;   

    //substring that fits into the frame
    tempStr=myText.substring(startIndex,endIndex);

    while(endIndex < myText.length()-1)
    {           

        //draw or add tempStr to the Frame
        //at this point 

        //set new start index
        startIndex=endIndex+1;

        //substring the remaining of text
        tempStr=myText.substring(startIndex,myText.length()-1);

        //calculate end of index that fits
        endIndex=myPaint.breakText(tempStr, true, frameWidth, null)-1;  

        //substring that fits into the frame
        tempStr=myText.substring(startIndex,endIndex);
    }

Similar methods are available for Android:

breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)

Measure the text, stopping early if the measured width exceeds maxWidth.

measureText(String text)

Return the width of the text.

http://developer.android.com/reference/android/graphics/Paint.html

like image 145
Arash N Avatar answered Oct 23 '22 03:10

Arash N