天天看点

Android TextView、EditText代码取消加粗(设置字体加粗、粗体效果、代码加粗无效)

加粗的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();