安卓代码中获取dimen设置字体大小setTextSize,会变得比dimen的值还大——解决方法

背景

 

holder.tvMsgContent.setTextSize(mContext.getResources().getDimensionPixelOffset(R.dimen.message_content_font));

<dimen name="message_content_font">32px</dimen>

实际效果: 上面第一句java代码,设置的是红框中的字体大小,按理说应该和上面的标题差不多大小吧,为什么差这么多呢?

解决

动态设置TextView字体大小时候,会出现偏差。

TextView中暴露出来设置字体大小的方法有两种。
setTextSize(float size)
setTextSize(int unit, float size)

上面用的是第一种,现在看看第二种方法的源码

 /**
     * Set the default text size to a given unit and value.  See {@link
     * TypedValue} for the possible dimension units.
     *
     * @param unit The desired dimension unit.
     * @param size The desired size in the given units.
     *
     * @attr ref android.R.styleable#TextView_textSize
     */
    public void setTextSize(int unit, float size) {
        Context c = getContext();
        Resources r;

        if (c == null)
            r = Resources.getSystem();
        else
            r = c.getResources();

        setRawTextSize(TypedValue.applyDimension(
                unit, size, r.getDisplayMetrics()));
    }


看到unit这个参数,是用来标记字体大小单位,TypedValue里面设置了好多种,我们常用的就两COMPLEX_UNIT_SP和COMPLEX_UNIT_PX,正好对应平时我们使用的px和sp。
它在内部默认传进来的size是sp单位的,也就是说不管你在外面做了什么处理,调用setTextSize(float size)这个方法时候,size的单位是sp。

这也就是你字体变大的原因。

正确使用时
setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, mContext.getResources().getDimensionPixelOffset(R.dimen.message_content_font))

现在的效果

猜你喜欢

转载自blog.csdn.net/qq_14902389/article/details/53418082