天天看點

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();