TextView具有lineSpacing时的ImageSpan.ALIGN_BASELINE

时间:2015-07-21 13:04:51

标签: android textview imagespan

我想将ImageSpan与文本的基线对齐,但我还需要在线之间添加一些间距。
问题在于,当我添加行间距时,ImageSpan不会与文本的基线对齐,而是与baseline+lineSpacing对齐,因此它的显示低于应有的值。

这有解决方法吗?

修改:进一步说明:

  1. 如果没有 lineSpacing(箭头是ImageSpan)。它与基线正确对齐。
    enter image description here

  2. 如果我添加android:lineSpacingMulitiplier="1.2",如何看待 enter image description here

  3. 编辑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);
    }
    

1 个答案:

答案 0 :(得分: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();
    }
}