2015-07-21 11 views
5

Ich möchte meine ImageSpan an die Grundlinie des Textes ausrichten, aber ich muss auch etwas Abstand zwischen den Zeilen hinzufügen.
Das Problem ist, dass, wenn ich Zeilenabstand hinzufügen, die ImageSpan nicht an der Grundlinie des Textes, sondern an die baseline+lineSpacing ausgerichtet ist, so dass es niedriger erscheint, als es sollte.ImageSpan.ALIGN_BASELINE wenn TextView lineSpacing hat

Gibt es einen Workaround?

Edit: Weitere Erläuterungen:

  1. , wie es aussieht ohnelineSpacing (der Pfeil ist die ImageSpan). Es ist korrekt auf die Grundlinie ausgerichtet.
    enter image description here

  2. Wie es aussieht, wenn ich hinzufügen android:lineSpacingMulitiplier="1.2"
    enter image description here

Edit 2 Der 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" /> 

Andere relevante Methoden:

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

mir zeigen, was u genau want..provide Code ya Bildschirm kurz – Destro

+0

@Destro Weitere excludied, was ich meine.Ich poste nicht den Code, da ich nichts besonderes mache, nur Hinzufügen von android: lineSpacingMulitiplier –

+0

wie Bild hinzufügen, bedeutet unter dem linearen Layout ya relativ Layout .. Bild ist in der Mitte in der vertikalen des Layouts hinzufügen – Destro

Antwort

0

hatte ich das gleiche Problem in letzter Zeit gelang es this answer mit Veränderung zu lösen. Ich konnte nicht herausfinden, wie die Zeilenhöhe von Font-Metriken zu bekommen, damit ich es als Konstante Schwimmer gesetzt (Sie es auch aus der Textview bekommen.

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