2015-07-21 12 views
5

Desidero allineare il mio ImageSpan alla linea di base del testo, ma devo anche aggiungere una spaziatura tra le righe.
Il problema è che quando aggiungo interlinea, lo ImageSpan non si allinea alla linea di base del testo, ma allo baseline+lineSpacing, quindi appare più basso di quanto dovrebbe.ImageSpan.ALIGN_BASELINE quando TextView dispone di lineSpacing

Esiste una soluzione alternativa?

Edit: Ulteriori spiegazioni:

  1. come sembra senzalineSpacing (la freccia è il ImageSpan). È allineato correttamente alla linea di base.
    enter image description here

  2. Come sembra che se aggiungo android:lineSpacingMulitiplier="1.2"
    enter image description here

Edit 2 Il codice:
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" /> 

Altri metodi rilevanti:

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

fammi vedere cosa u codice esattamente want..provide ya short screen – Destro

+0

@Destro Ulteriori spiegazioni di cosa intendo: non ho inserito il codice poiché non sto facendo nulla di speciale, aggiungendo semplicemente android: lineSpacingMulitiplier –

+0

come aggiungere un'immagine, significa sotto il layout lineare ya relativo layout .. Immagine è aggiungi al centro in verticale di layout – Destro

risposta

0

Ho avuto lo stesso problema ultimamente, è riuscito a risolverlo con l'alterazione this answer. non riuscivo a trovare il modo di ottenere l'altezza della linea da metriche di carattere così mi sono messo come un galleggiante costante (è anche possibile ottenere dal 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(); 
    } 
}