Wednesday, May 31, 2017

Android textview text get cut off on the sides with custom font

Leave a Comment

This is what happens in the preview and on device: Text bug

TextView is nothing special, it just loads the custom font:

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

Layout is also very basic, but just in case:

<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> 

As you can see, the left parts, like 'j' and 'f' are cut off.

Setting the padding or margin did not work.

This font fits into it's frame when using from other programs.

Thanks in advance.

Edit: What @play_err_ mentioned is not a solution in my case.

  • I am using in the final version a textview that resizes automatically, so adding spaces would be terribly difficult.
  • I need an explanation why other programs (eg photoshop, after effects...) can calculate a proper bounding box and android cannot
  • I am also loading different fonts dynamically and I do not want to create an

    if(badfont)      addSpaces() 

3 Answers

Answers 1

This answer has led me to the right path: https://stackoverflow.com/a/28625166/4420543

So, the solution is to create a custom Textview and override the onDraw method:

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

Answers 2

Android:gravity="center" and use Android:layout_paddingleft="value" hope it will work..

Answers 3

What if you wrap it in another layout and add padding to that? For example something like this:

<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> 

Not having your font and other themes etc I've just tried it with the cursive font for example and on my machine it would look like this. screenshot

Update: Looks like you're not the only one to have had this issue and the other answers here and here both unfortunately relate to adding extra spaces.

I've created a bug ticket here since it looks like a bug to me.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment