首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageSpan.ALIGN_BASELINE当TextView有lineSpacing时

ImageSpan.ALIGN_BASELINE当TextView有lineSpacing时
EN

Stack Overflow用户
提问于 2015-07-21 13:04:51
回答 1查看 2.6K关注 0票数 9

我想使我的ImageSpan与文本的基线对齐,但我也需要在行之间添加一些间距。

问题是,当我添加行距时,ImageSpan并不与文本的基线对齐,而是与baseline+lineSpacing对齐,因此它看起来比应该的要低。

有解决办法吗?

编辑:进一步解释:

  1. 如果没有lineSpacing,它是什么样的(箭头是ImageSpan)。它与基线正确地对齐。

  1. 如果我添加android:lineSpacingMulitiplier="1.2",会是什么样子?

编辑2代码:

XML:

代码语言:javascript
复制
<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" />

其他相关方法:

代码语言:javascript
复制
    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;
}

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-08 11:22:15

我最近也遇到了同样的问题,设法通过改变this answer来解决它。我无法找到如何从字体度量中获得行高,所以我将其设置为常量浮点数(您也可以从TextView获得它)。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31539860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档