Intereting Posts
Не удается найти класс MainActivity (импортированный проект) View on press onpress: изменить цвет фона при нажатии? Как показать, что нажата кнопка View? Максимальная ширина и высота для ImageView в Android Как я могу сказать ProGuard, чтобы сохранить мою функцию, которая используется для onClick? Всплывающее меню при нажатии кнопки в действии. Можно ли использовать Java 8 для разработки Android? Полученное сообщение GCM отображается с искаженным текстом Самый простой способ воспроизведения аудио RTMP-потока в Android Запуск действия ACTION_VIEW для открытия браузера, как мне вернуться в мое приложение? Как повторить этот JSON-массив с использованием Java и org.json в Android? Xamarin Studio 2 – последнее стабильное обновление – Ошибка выполнения задачи Aapt: Исходная последовательность пуста Как сделать уведомление в Facebook как Messenger в Android Как разработать интерфейс, который будет выглядеть как родной для Android с помощью jQuery-mobile? Как получить memcpy в Java? Проблема TarsosDSP и SurfaceView с несколькими потоками

Определите, где Android TextView вставляет разрыв строки

У меня прямоугольная плитка, и я хочу подгонять изображение и некоторый текст в него. Изображение не должно перекрывать текст, а размеры изображения и текста могут различаться.

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

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

Это отлично работает, если текст находится только на одной строке.

Но если TextView обертывает текст на несколько строк, я не могу предсказать границы текста, так как я не знаю, где TextView будет вставлять автоматические разрывы строк.

Как узнать позиции в тексте, где TextView вставляет автоматический разрыв строки?

Пример: с учетом текста

Lorem ipsum dolor sit amet

Которые будут

 | Lorem ipsum | | dolor sit amet | 

Мне нужна функция, которая преобразует

Lorem ipsum dolor sit amet

в

Lorem ipsum \ndolor sit amet

TextView (объект макета) имеет некоторые полезные функции для выполнения, которые вы пытаетесь выполнить:

http://developer.android.com/reference/android/text/Layout.html

Взгляни на:

getLineCount()

getLineEnd(int line)

Вы можете получить подстроку для строки TextView на основе того, где символ находится в каждой строкеEnd.

Вам нужно будет использовать getViewTreeObserver() чтобы дождаться, пока TextView будет нарисован, прежде чем вы сможете позвонить им и получить от них полезную информацию.

Кроме того, вы можете создать пользовательский TextView, который может предоставлять данные с помощью встроенных методов или путем добавления к ним слушателя. Пример пользовательского TextView, который изменяет размер текста, приведен ниже:

Android эллипсирование многострочного текста

Я использовал это и сделал аналогичные изменения (например, то, что вы пытаетесь сделать).

Вероятно, вы захотите включить эту логику в пользовательское представление (переопределяя onSizeChanged() ), но вы можете использовать класс Layout для проверки, где заканчивается каждая строка:

 textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // Remove immediately so it only fires once textView.getViewTreeObserver().removeGlobalOnLayoutListener(this); // View should be laid out, including text placement final Layout layout = textView.getLayout(); float maxLineWidth = 0; // Loop over all the lines and do whatever you need with // the width of the line for (int i = 0; i < layout.getLineCount(); i++) { maxLineWidth = Math.max(maxLineWidth, layout.getLineWidth(i)); } } });