我们在使用TextView时,显示的文字与控件四周都会有一定的间隙,特别是上下间隙,有时候对我们的布局对齐问题会带来一定的麻烦,当你搜索解决办法时,都会得到同一个信息,就是设置includeFontPadding=false,但当你设置之后,却发现,不是你想要的结果。
对includeFontPadding的解释基本上就是说可以去掉留白,但是这个留白到底是留的哪个白,却很少有人说清楚,不要留白,我们第一反应就是应该文字和空间上下无间隙,但结果却不随人所愿,那现在就来看看includeFontPadding到底是留掉了哪个白。
大家可以先了解一下FontMetrics的属性,当TextView测量绘制过程中,会执行BoringLayout的init方法,这里面就对看到了这个属性的处理,摘取代码如下
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空间而已。