2015-08-17 2 views
-1

У меня есть текстовое изображение, которое как ширина fill_parent под корневым расположением, что означает, что оно имеет ширину экрана 480.
Я пытаюсь измерить границы этого текста в текстовом представлении. Таким образом, я сделал это:Android: Paint.getTextBounds возвращает ширину намного большую, чем ширина экрана

Rect rect = new Rect(); 
textView.getPaint().getTextBounds(text,0,text.length()-1,rect); 
Log.v(TAG,"Width : Height ="+rect.width()+" : "+width.height()); 

Но оно печатает 10278 : 79. Почему он печатает ширину как 10278, когда сама ширина scren равна 480? Если предполагается, что это единственная строка и вычисление, то в чем смысл getTextBounds.

+0

Вы можете разместить полный код? Неясно, откуда берется значение в тексте. – Sebastian

+0

@Sebastian: текст - это строка. длинная строка. Содержит около 1000 символов. – Ashwin

ответ

0

В документации указано, что int end «1 за последним символом в строке для измерения». http://developer.android.com/reference/android/graphics/Paint.html#getTextBounds(java.lang.String, Int, Int, android.graphics.Rect)

Вы должны иметь:

textView.getPaint().getTextBounds(text, 0, text.length(), rect); 

Это также относится и к Canvas.drawText().

Текст, отображающий текст, будет «обертывать» текст. Метод getTextBounds вообще не знает TextView.

Фактически, если бы вы создали собственный пользовательский вид для отображения текста, getTextBounds был бы очень полезен для достижения вашей собственной текстовой упаковки. Следующий код выполняет ужасную работу с презентацией, но выполняет итерацию по строкам, разделяя их на холст, эффективно обертывая текст.

private void drawText(Canvas canvas) { 

     String text = "Nunc eleifend erat eu nulla varius iaculis. Quisque feugiat justo sit amet" + 
       " neque interdum tempor. Curabitur faucibus facilisis tristique. Donec posuere" + 
       " viverra magna, eu accumsan sapien congue id. Cras fringilla justo ut lacus" + 
       " molestie, et venenatis orci egestas. Vivamus pretium, nisl quis cursus cursus," + 
       " dolor eros porta neque, sit amet viverra ante orci non elit. Donec odio neque," + 
       " volutpat sit amet dui sit amet, fringilla tempus sapien. Donec sed mollis justo." + 
       " In dignissim tincidunt neque, eu luctus justo egestas nec. Donec commodo ut arcu" + 
       " vel placerat. Donec ullamcorper justo eget justo commodo hendrerit. Quisque" + 
       " commodo imperdiet posuere. Aenean vehicula dui."; 

     Paint paint = new Paint(); 
     paint.setTextSize(30); 
     paint.setAntiAlias(true); 

     int padding = 20; 

     int availWidth = getWidth() - 2 * padding; 
     int availHeight = getHeight() - 2 * padding; 

     Rect bounds = new Rect(); 
     int currentTextBottom = 0; 
     int firstCharInLine = 0; 
     int lastCharInLine = 0; 

     outerLoop: while (currentTextBottom < availHeight) { 

      while (Character.isWhitespace(text.charAt(firstCharInLine))) { 
       lastCharInLine = ++firstCharInLine; 
      } 

      for (int i = firstCharInLine + 1; i < text.length(); i++) { 
       paint.getTextBounds(text, firstCharInLine, i, bounds); 

       if (bounds.width() <= availWidth) { 
        if (Character.isWhitespace(text.charAt(i))) { 
         lastCharInLine = i; 
        } 
       } else { 
        currentTextBottom += bounds.height(); 
        if (firstCharInLine == lastCharInLine) { 
         lastCharInLine = i; 
        } 
        canvas.drawText(text, firstCharInLine, lastCharInLine, padding, currentTextBottom + padding, paint); 
        firstCharInLine = lastCharInLine++; 
        break; 
       } 
       if (i == text.length() - 1) { 
        currentTextBottom += bounds.height(); 
        lastCharInLine = text.length(); 
        canvas.drawText(text, firstCharInLine, lastCharInLine, padding, currentTextBottom + padding, paint); 
        break outerLoop; 
       } 
      } 
     } 
    } 
} 

EDIT - как примечание стороны, я только сейчас заметил разницу между bounds.width() и Paint.measureText (!) Полностью не связанный с вышеуказанным кодом, у меня были проблемы с Paint.Align.Center сбой и не всегда работали как ожидалось. Поэтому я удалил любое выравнивание текста и попытался:

canvas.drawText(
     text, 
     viewWidth/2f - bounds.width()/2f, 
     viewHeight/2f + bounds.height()/2f, 
     paint); 

Но это не выравнивается горизонтально. Когда я сделал это вместо:

float textWidth = paint.measureText(text); 
canvas.drawText(
     text, 
     viewWidth/2f - textWidth/2, 
     viewHeight/2f + bounds.height()/2f, 
     paint); 

Он выровнен к моему удовольствию :)

+0

"if (bounds.width() <= avaiWidth)" - Разве это не всегда так? Почему такое условие? «bounds.width()» - это ширина символа, где, поскольку availWidth - общая доступная ширина. – Ashwin

+0

Нет, оценки вычисляются для постоянно растущего раздела строки (от firstCharInLine до и не включая i). В какой-то момент он превысит availWidth, затем вы завернете линию –

1

getTextBounds не возвращает размер View, но минимальное пространство, необходимое для отображения полной строки, вы даете ему:

Возврат в пределах (выделенных вызывающему) наименьшего прямоугольника, охватывает все символы, с подразумеваемым началом в (0,0).

Это означает, что для 1000 символов, а также учитывая текущий настроенный шрифт в Paint объекта, потребуется, по меньшей мере 10278 пикселей для их печати. Не имеет значения, что ваш текст или объект Paint пришел из текстового поля.

+0

@Sebastin - тогда почему есть атрибут высоты. Итак, вы говорите, что он будет считать, что он как один текст линии вычисляет ширину? Если да, то как он отличается от метода measureText()? – Ashwin

+0

getTextBounds возвращает наименьший прямоугольник (не только ширину), поэтому вы также получите высоту.Вы можете поэкспериментировать, чтобы узнать, что произойдет, если вы включите в текст символы новой строки. Re: measureText, check [this] (http://stackoverflow.com/questions/7549182/android-paint-measuretext-vs-gettextbounds) – Sebastian

+0

@Sebastin: Хорошо. Итак, это будет следующая строка только в том случае, если в тексте есть новый символ строки? И не тогда, когда ширина превышает ширину текста? – Ashwin

Смежные вопросы