加粗的xml方式:
(4.4以前是无法加粗中文的,现在4.4以下几乎没有,可以忽略)
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold" />
代码伪方式:
(这个和上面有点区别,仔细对比会发现比上面细)
tv.getPaint().setFakeBoldText(true);
tv.invalidate()//必须触发重绘
正确的代码方式:
tv.setTypeface(null, Typeface.NORMAL);
tv.invalidate();
如果自定义字体的话,你会发现加粗能用,但怎么都无法取消加粗:
tv.setTypeface(tv.getTypeface(), Typeface.NORMAL);//无效
tv.invalidate();
事实上被源码坑了一波:
public void setTypeface(@Nullable Typeface tf, @Typeface.Style int style) {
if (style > 0) {
if (tf == null) {
tf = Typeface.defaultFromStyle(style);
} else {
tf = Typeface.create(tf, style);//加粗时会创建加粗字体
}
setTypeface(tf);
// now compute what (if any) algorithmic styling is needed
int typefaceStyle = tf != null ? tf.getStyle() : 0;
int need = style & ~typefaceStyle;
mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);
mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
} else {
mTextPaint.setFakeBoldText(false);
mTextPaint.setTextSkewX(0);
setTypeface(tf);//取消时并没有创建加粗字体
}
}
所以取消加粗时你需要自己create一个:
tv.setTypeface(Typeface.create(tv.getTypeface(), Typeface.NORMAL), Typeface.NORMAL);
tv.invalidate();