ImageSpan.ALIGN_BASELINE when TextView has lineSpacing

I want to align my ImageSpan with the base text of the text, but I also need to add some line spacing.
The problem is that when I add line spacing, ImageSpan does not align with the base text of the text, but with baseline+lineSpacing , so it looks lower than it should.

Is there a workaround?

Edit: Further explanation:

  • How it looks without lineSpacing (arrow - ImageSpan ). It is correctly aligned with the baseline.
    enter image description here

  • What does it look like if I add android:lineSpacingMulitiplier="1.2"
    enter image description here

Change 2 Code:
XML:

 <com.kushtrim.example.views.CustomTypefaceTextView android:id="@+id/descId" android:layout_width="match_parent" android:layout_height="wrap_content" android:lines="3" android:gravity="center_vertical" android:layout_marginLeft="@dimen/_45" android:layout_marginTop="@dimen/_6" android:layout_marginBottom="@dimen/_20" app:font_type="merriweather_regular" android:textSize="@dimen/f40" android:lineSpacingMultiplier="1.2" android:textColor="@color/black" android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit." android:ellipsize="end" /> 

Other relevant methods:

  private Spannable getContentText(ContactRaport contactRaport) { DateTime dateTime = new DateTime(contactRaport.contactDate); String datePart = dateTime.getDayOfMonth() + " " + dateTime.monthOfYear().getAsShortText(new Locale("nl")) + "; "; String completeText = datePart + contactRaport.note; Typeface font1 = Typeface.createFromAsset(context.getAssets(), "MyFont1.ttf"); Typeface font2 = Typeface.createFromAsset(context.getAssets(), "MyFont2.ttf"); SpannableStringBuilder spannable = new SpannableStringBuilder("XX"); ImageSpan arrow = getArrowImageSpan(contactRaport); spannable.setSpan(arrow, 0, 2, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); spannable.append(completeText); spannable.setSpan(new CustomTypefaceSpan("", font1 ), 2, datePart.length()+1, Spanned.SPAN_EXCLUSIVE_INCLUSIVE); spannable.setSpan(new CustomTypefaceSpan("", font2), datePart.length(), completeText.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE); spannable.setSpan(new ForegroundColorSpan(getContentDateColor(contactRaport)),2, datePart.length()+1, 0); return spannable; } 

.

 private ImageSpan getArrowImageSpan(ContactRaport contactRaport) { Drawable d = null; switch (contactRaport.type) { ... logic to load the correct drawable } d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); return new ImageSpan(d, ImageSpan.ALIGN_BASELINE); } 
+5
source share
1 answer

I had the same problem recently, she managed to solve it by changing this answer . I could not learn how to get the line height from font metrics, so I set it as a constant float (you can also get it from a TextView.

 private static class CenterImageSpan extends ImageSpan { public CenterImageSpan(Drawable d) { super(d, ALIGN_BOTTOM); } public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { Drawable b = getDrawable(); canvas.save(); int transY = bottom - b.getBounds().bottom; // this is the key transY -= paint.getFontMetricsInt().descent / 2; // adjust it for the current line height transY *= 1 - (LINE_HEIGHT - 1) * 2; canvas.translate(x, transY); b.draw(canvas); canvas.restore(); } } 
0
source

All Articles