Android-TextView的includeFontPadding到底行不行

原创 2017年09月27日 10:57:32

我们在使用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空间而已。






版权声明:本文为博主原创文章,未经博主允许不得转载。

[已解决]android的textview 里面的text 怎么也不到中间的位置,这个时候需要设置android:includeFontPadding="false"

android的textview 里面的text 怎么也不到中间的位置,这个是因为考虑了字体的padding,这个时候需要设置android:includeFontPadding="false" ...
  • Rodulf
  • Rodulf
  • 2016年11月14日 17:41
  • 1649

android:includeFontPadding的使用:清除TextView字体周边空白

在设置界面布局的时候,设计师会给一张标注了尺寸的UI设计图,如果在UI中包含了TextView空间的话,会发现即使完全按照标注的尺寸来做,最终的显示效果和设计图还是有差异。打开开发者模式中的布局边界,...
  • liuweiballack
  • liuweiballack
  • 2015年08月24日 23:50
  • 15168

Amazon的推荐系统到底行不行?

原文: https://mp.weixin.qq.com/s?__biz=MzA4OTk5OTQzMg==&mid=2449231246&idx=1&sn=16fbcb9418dbe4f6fac8e...
  • u013527419
  • u013527419
  • 2017年03月29日 20:13
  • 330

Android开发 常用控件罕见特殊属性集锦

Android 针对控件的特殊数据和常见问题分析处理!
  • wenbitianxiafeng
  • wenbitianxiafeng
  • 2014年02月13日 14:19
  • 4582

马云说的到底对不对,京东到底行不行?

很多人都说中式互联网江湖其实最像娱乐圈,从现在的趋势看,这其实是真的,并在近来马云战京东这事上得到了最好的体现。马云吐槽京东这事被引爆以来似乎就没人去关注马云说的东西对不对,有没有价值,大家更多的只是...
  • qisefengzheng
  • qisefengzheng
  • 2015年01月14日 10:40
  • 340

Android-TextView

Android-TextView 一 介绍 TextView是许多控件的基类,是非常复杂的组件 二 xml常用的通用的属性 android:hint="no data"提示字符 an...
  • qq_22075977
  • qq_22075977
  • 2015年06月08日 21:02
  • 315

学校学java到底行不行啊?

  • JavaEETeacher
  • JavaEETeacher
  • 2009年11月09日 09:07
  • 1917

android-textview

转自:http://www.tuicool.com/articles/nE3mma 从零开始学android 时间 2014-04-05 11:57:37  CSDN博客 原文  htt...
  • GSH_Android_Bar
  • GSH_Android_Bar
  • 2015年06月23日 20:11
  • 402

iPhone7 plus分辨率行不行

分辨率1920*1080(FHD) iPhone7 plus 128G优惠促销截图 分辨率1920*1080(FHD) iPhone7 plus 128G优秀特性 分辨率1...
  • jamie0515
  • jamie0515
  • 2017年08月10日 18:48
  • 343

android-TextView属性

android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) android...
  • thisiscx
  • thisiscx
  • 2013年01月28日 08:53
  • 220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-TextView的includeFontPadding到底行不行
举报原因:
原因补充:

(最多只允许输入30个字)