2017-05-19 60 views
8

To co się dzieje w podglądzie i na urządzeniu: Text bugAndroid tekst TextView obcięta po bokach z niestandardowej czcionki

TextView to nic specjalnego, po prostu ładuje czcionki niestandardowe:

public class TestTextView extends AppCompatTextView { 

    public TestTextView(Context context) { 
     super(context); 

     init(context); 
    } 

    public TestTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     init(context); 
    } 

    public TestTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     init(context); 
    } 

    void init(Context context) { 

     Typeface t = Typeface.createFromAsset(context.getAssets(), "fonts/daisy.ttf"); 

     setTypeface(t); 
    } 
} 

Układ jest bardzo prosty, ale na wszelki wypadek:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/material_red200" 
    android:orientation="vertical">  

    <*custompackage* .TestTextView 
     android:gravity="left" 
     android:padding="0dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="just some text for testing" 
     android:textColor="@color/material_black" 
     android:textSize="100dp" /> 

</LinearLayout> 

Jak widać, po lewej części, takie jak „j” i „F” są odcięte.

Ustawienie wypełnienia lub marginesu nie działa.

Ta czcionka pasuje do ramki podczas korzystania z innych programów.

Z góry dziękuję.

Edytuj: To, o czym wspomniałem @play_err_, nie jest rozwiązaniem w moim przypadku.

  • Używam w wersji ostatecznej widok tekstowy, który zmienia rozmiar automatycznie, więc dodanie spacji byłoby strasznie trudne.
  • muszę wyjaśnić, dlaczego inne programy (np photoshop, after effects ...) można obliczyć właściwą obwiednię i android nie może
  • Ja również ładowanie różnych czcionek dynamicznie i nie chcę, aby utworzyć

    if(badfont) 
        addSpaces() 
    
+0

spróbować usunąć 'android: dopełnienia = "0dp" ' –

+0

@AlexanderTumanin nie ma to żadnego wpływu na wynik. – andras

+0

Spróbuj dodać białe spacje za ostatnim znakiem lub ustaw stałą szerokość dla TestTextView. –

Odpowiedz

4

Odpowiedź ta doprowadziła mnie na właściwą drogę: https://stackoverflow.com/a/28625166/4420543

Tak więc rozwiązaniem jest utworzenie niestandardowego TextView i zastąpić metodę OnDraw:

@Override 
    protected void onDraw(Canvas canvas) { 
     final Paint paint = getPaint(); 
     final int color = paint.getColor(); 
     // Draw what you have to in transparent 
     // This has to be drawn, otherwise getting values from layout throws exceptions 
     setTextColor(Color.TRANSPARENT); 
     super.onDraw(canvas); 
     // setTextColor invalidates the view and causes an endless cycle 
     paint.setColor(color); 

     System.out.println("Drawing text info:"); 

     Layout layout = getLayout(); 
     String text = getText().toString(); 

     for (int i = 0; i < layout.getLineCount(); i++) { 
      final int start = layout.getLineStart(i); 
      final int end = layout.getLineEnd(i); 

      String line = text.substring(start, end); 

      System.out.println("Line:\t" + line); 

      final float left = layout.getLineLeft(i); 
      final int baseLine = layout.getLineBaseline(i); 

      canvas.drawText(line, 
        left + getTotalPaddingLeft(), 
        // The text will not be clipped anymore 
        // You can add a padding here too, faster than string string concatenation 
        baseLine + getTotalPaddingTop(), 
        getPaint()); 
     } 
    } 
0

Android: grawitacja = "center" i używać Android: layout_paddingleft = "wartość" nadzieję, że to będzie działać ..

+0

małe litery android. –

+0

To nie działa – andras

0

Co jeśli zawinąć go w innym układzie i dodać dopełnienie do tego? Na przykład coś takiego:

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="24dp"> 
     <*custompackage* .TestTextView 
     android:gravity="left" 
     android:padding="0dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="just some text for testing" 
     android:textColor="@color/material_black" 
     android:textSize="100dp" /> 
</RelativeLayout> 

nie mając swoją czcionkę i inne tematy etc Właśnie spróbowałem z kursywą czcionki dla przykładu i na moim komputerze będzie wyglądać następująco. screenshot

Aktualizacja: Wygląda na to, że nie jesteś jedynym, który miał ten problem i inne odpowiedzi here i here zarówno niestety dotyczą dodawania dodatkowych spacji.

Utworzyłem zgłoszenie błędu here, ponieważ wygląda na to, że jest to błąd.

+0

Myślę, że nadal jest odcięty. Spójrz na pierwszą postać "j" –

+0

Och, moje złe. Nie zauważyłem tego na początku. Po prostu założyłem, że to styl czcionki. – Kai

+0

Wypełnienie powodowało, że tekst był mniejszy (zgodnie z oczekiwaniami), nie miał żadnego wpływu na cięcie. – andras