TextView lineSpacingMultiplier меньше нуля отбирает последнюю строку

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

  <TextView
    android:id="@+id/text_header"
    android:layout_width="@dimen/text_header_width"
    android:layout_height="wrap_content"
    android:text="@string/header_text"
    android:textSize="@dimen/text_header_text_size"
    android:typeface="helvetica"
    android:lineSpacingMultiplier="0.95" />

Но в тексте в нижней строке уменьшаются отрисовки (например, y, g, и p). Другими словами, в нижней части этих букв не хватает 2 или 3 пикселя.

Я пробовал играть с полями и дополнением без каких-либо успехов. Кажется, я могу исправить проблему, используя указанную высоту (с небольшой дополнительной комнатой) вместо wrap_content, но я бы хотел избежать этого, если это возможно.

Ответ 1

Из моего тестирования это похоже на проблему с версиями Android ниже api 21. Я решил это так:

В моем случае я использую TextView, который имеет максимум 2 строки с эллипсисом в конце.

Стиль для моего TextView до api 21 (values/style.xml)

<style name="MyTextViewStyle" parent="Base.TextAppearance.AppCompat">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:gravity">left</item>
    <item name="android:textColor">@color/blue_dark</item>
    <item name="android:textSize">16sp</item>
    <item name="android:maxLines">2</item>
    <item name="android:ellipsize">end</item>
    <item name="android:lineSpacingExtra">-4dp</item>
    <item name="android:paddingTop">0dp</item>
    <item name="android:paddingBottom">4dp</item>
    <item name="android:includeFontPadding">false</item>
</style>

Стиль для моего TextView для api 21 и после (values-v21/style.xml)

<style name="MyTextViewStyle" parent="Base.TextAppearance.AppCompat">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:gravity">left</item>
    <item name="android:textColor">@color/blue_dark</item>
    <item name="android:textSize">16sp</item>
    <item name="android:maxLines">2</item>
    <item name="android:ellipsize">end</item>
    <item name="android:lineSpacingExtra">-4dp</item>
    <item name="android:paddingTop">0dp</item>
    <item name="android:paddingBottom">0dp</item>
    <item name="android:includeFontPadding">true</item>
</style>

Секрет здесь в основном android:paddingBottom, который противоположный android:lineSpacingExtra до api 21. На моих устройствах он исправляет ошибку последней строки, отрубленной внизу.

ПРИМЕЧАНИЕ. <item name="android:lineSpacingExtra">-4dp</item> выглядит как эквивалент <item name="android:lineSpacingMultiplier">0.8</item>.

Ответ 2

Попробуйте это

из вашего кода используйте textView.setLineSpacing()

или

из вашего xml используйте android:lineSpacingExtra="xxdp"