Как получить высоту текста с фиксированной шириной и получить длину текста, которая помещается в рамку? - PullRequest
6 голосов
/ 01 декабря 2010

ну, мне удалось уместить все мои вопросы в заголовке. Мне нужно разбить длинный текст на столбцы / фреймы и расположить их для просмотра. Я уже несколько дней ищу решения, но не могу найти ни примеров, ни четкой документации о том, как выполнить любую из моих задач. Я видел некоторые упоминания о StaticLayout, но я не знаю, как правильно его использовать. Что касается высоты текста, я пробовал метод getTextBounds TextPaint, но у него нет ограничения по ширине, и похоже, что он измеряет только одну строку (ну, может быть, я что-то делал не так).

Может быть, у кого-то есть пример StaticLayout или его использование подкласса?

Все выглядит так просто «на бумаге»: создайте «рамку», проверьте, сколько символов помещается в нее, заполните рамку и расположите ее, повторите до конца текста, и все же я не могу ничего найти о том, как это сделать: )

1 Ответ

6 голосов
/ 10 декабря 2010

Я не знаю точного ответа на ваш вопрос, но обычно вы можете рассчитать ширину и высоту текста на основе типа и размера шрифта, используя методы, доступные в графической библиотеке.

Я сделал это на C # и Java.в C # он называется «MeasureString», а в Java - «FontMetrics».

EDIT:

Проверьте, полезен ли этот код (я не скомпилировал его, потому что у меня нет androidSDK здесь):

    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);
    }

Аналогичные методы доступны для Android:

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

Измерьте текст, останавливаясь раньше, если измеренная ширина превышает maxWidth.

measureText(String text)

Возвращает ширину текста.

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

...