Android SpannableString富文本距离底部对齐

实际展示效果
1.0折字体
单独Demo调式
文字和数字或者英文字符底部不齐原因
1、数字与文字虽然baseline对齐了,但是文字 在baseline下方多占据了一小快(des区域)
2、如果只有数字或字符,就可以底对齐,要是有富文本,就需要偏移
文本Baseline

TeextView 信息

 contentSize...77..descent..21.714...ascent..-80.388...bottom...21.714...top...-80.388....height...102.102005..total height...103
VerticalCenterSpan
start..4....end....7....x.....564.0...y...76...bottom...97...top..0
Code
public class VerticalBottomSpan extends ReplacementSpan {

private int fontSizePx;    //px
private float mOffset;    //px

public VerticalBottomSpan(int fontSizePx,float offset) {
    this.fontSizePx = fontSizePx;
    this.mOffset = offset;
}

@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
    text = text.subSequence(start, end);
    Paint p = getCustomTextPaint(paint);
    return (int) p.measureText(text.toString());
}

@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
    text = text.subSequence(start, end);
    Paint p = getCustomTextPaint(paint);
    Paint.FontMetricsInt fm = p.getFontMetricsInt();
    // 此处重新计算y坐标,使字体居中
    canvas.drawText(text.toString(), x, y+mOffset, p);
    Log.d("VerticalCenterSpan", "..start.." + start + "....end...." + end + "....x....." + x + "...y..." + y +
            "...bottom..." + bottom + "...top.." + top);
}

private TextPaint getCustomTextPaint(Paint srcPaint) {
    TextPaint paint = new TextPaint(srcPaint);
    paint.setTextSize(fontSizePx);   //设定字体大小, sp转换为px
    return paint;
}
}
Use
String str = 1.0+ "折";
spannableString = new SpannableString(str);
spannableString.setSpan(new   
VerticalBottomSpan(SizeUtils.dp2px(mContext,13),-3),str.length() - 1,   
str.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tv.setText(spannableString);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容