bdmh的专栏

QQ:515840062

Android-TextView的includeFontPadding到底行不行

我们在使用TextView时,显示的文字与控件四周都会有一定的间隙,特别是上下间隙,有时候对我们的布局对齐问题会带来一定的麻烦,当你搜索解决办法时,都会得到同一个信息,就是设置includeFontPadding=false,但当你设置之后,却发现,不是你想要的结果。

includeFontPadding的解释基本上就是说可以去掉留白,但是这个留白到底是留的哪个白,却很少有人说清楚,不要留白,我们第一反应就是应该文字和空间上下无间隙,但结果却不随人所愿,那现在就来看看includeFontPadding到底是留掉了哪个白。

大家可以先了解一下FontMetrics的属性,当TextView测量绘制过程中,会执行BoringLayoutinit方法,这里面就对看到了这个属性的处理,摘取代码如下

        if (includepad) {
            spacing = metrics.bottom - metrics.top;
            mDesc = metrics.bottom;
        } else {
            spacing = metrics.descent - metrics.ascent;
            mDesc = metrics.descent;
        }

        ......

        if (includepad) {
            mTopPadding = metrics.top - metrics.ascent;
            mBottomPadding = metrics.bottom - metrics.descent;
        }
第一个if条件处,如果允许留白,那计算spacing的值是不一样的,留白时,值要大

第二个if条件处,如果允许留白,上下的padding是有值的,那这两个值,后面我们会展示。

其实也就是说,includeFontPadding的设置,如果不留白,也就是上下的padding=0而已,并不会使得文字间隙和空间无间隙。

然后我们继承TextView,自定义一个组件

public class MyTextView extends TextView {
    public MyTextView(Context context) {
        super(context);
    }

    public MyTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint.FontMetrics metrics = getPaint().getFontMetrics();
        RectF rect = new RectF(0,0,getWidth(),metrics.ascent-metrics.top);
        Paint p = new Paint();
        p.setStyle(Paint.Style.FILL);
        p.setColor(Color.RED);
        canvas.drawRect(rect,p);
        rect = new RectF(0,getHeight() - metrics.bottom+metrics.descent,getWidth(),getHeight());
        p.setColor(Color.BLUE);
        canvas.drawRect(rect,p);
    }
}
然后我们做一个布局,横向放置两个MyTextView组件,第二个设置android:includeFontPadding="false"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.menghui.myapplication.MainActivity">

    <com.example.menghui.myapplication.MyTextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:layout_weight="1"
        android:text="中国人"
        android:textSize="50sp" />

    <com.example.menghui.myapplication.MyTextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:layout_weight="1"
        android:includeFontPadding="false"
        android:text="中国人"
        android:textSize="50sp" />
</LinearLayout>
运行后,我们看,第二张是把布局边界显示出来的效果,红色区域是metrics.ascent到metrics.top之间区域,蓝色是metrics.bottom到metrics.descent之间的区域



比较左侧和右侧的两种现象,右侧是设置了不留白,明显比左侧上面和下面都缩小了一定的空间,这个空间就是上面init代码中topPadding和bottomPadding的值,可见includeFontPadding的设置,并不是我们想象的0间隙,只是去掉了一定的padding空间而已。






阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bdmh/article/details/78110557
个人分类: Android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭