2015-07-21 2 views
5

Я хочу выровнять мой ImageSpan с базовым текстом, но мне также нужно добавить некоторый интервал между строками.
Проблема заключается в том, что когда я добавляю межстрочный интервал, ImageSpan не выравнивается с базовой линией текста, а до baseline+lineSpacing, поэтому он появляется ниже, чем должен.ImageSpan.ALIGN_BASELINE, когда TextView имеет lineSpacing

Есть ли обходной путь к этому?

Edit: Дальнейшее объяснение:

  1. Как это выглядит как безlineSpacing (стрелка является ImageSpan). Он правильно выровнен по отношению к базовой линии.
    enter image description here

  2. Как это выглядит, как если бы я добавить android:lineSpacingMulitiplier="1.2"
    enter image description here

Edit 2 Код:
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" /> 

Другие соответствующие методы:

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

показать мне, что у точно want..provide код ya screen short – Destro

+0

@Destro Дальше объяснил, что я имею в виду. Я не публиковал код, так как не делаю ничего особенного, просто добавляю android: lineSpacingMulitiplier –

+0

как добавить изображение, означает под линейной компоновкой ya относительный макет .. Изображение добавляет в центр по вертикали макета – Destro

ответ

0

У меня была та же проблема, в последнее время, удалось решить с изменением this answer. я не мог узнать, как получить высоту строки из метрик шрифта, так что я установить его в качестве постоянного поплавка (вы также можете получить его от 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(); 
    } 
}