實(shí)際展示效果
1.0折字體
單獨(dú)Demo調(diào)式
文字和數(shù)字或者英文字符底部不齊原因
1、數(shù)字與文字雖然baseline對齊了勺疼,但是文字 在baseline下方多占據(jù)了一小快(des區(qū)域)
2教寂、如果只有數(shù)字或字符,就可以底對齊执庐,要是有富文本酪耕,就需要偏移
文本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();
// 此處重新計(jì)算y坐標(biāo),使字體居中
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); //設(shè)定字體大小, sp轉(zhuǎn)換為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);