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空间而已。






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

从程序员到项目经理(28):该死的结果导向(只看结果,不问过程到底行不行?)【转载】

在当今流行的管理体系中,结果导向由于迎合了公司高层的味口而大行其道。项目成功,你就是英雄;出了问题你就是狗熊,而不管是什么原因。正因为如此,在传统的目标管理中,公司与员工之间充满了博弈,导致双方出现了...

从程序员到项目经理(28):该死的结果导向(只看结果,不问过程到底行不行?)

在当今流行的管理体系中,结果导向由于迎合了公司高层的味口而大行其道。项目成功,你就是英雄;出了问题你就是狗熊,而不管是什么原因。正因为如此,在传统的目标管理中,公司与员工之间充满了博弈,导致双方出现了...

女装实体店加盟海玲服饰到底行不行?

回答1:个人认为你如果想要做女装实体店加盟,那么选择海玲服饰是一个非常好的选择,因为对于现在的市场行情来说,女装实体店加盟需要选择一个相对来说有竞争力并且有着非常好口碑的服装品牌非常有必要。比如说如果...

人事经理揭秘应聘窍门:行不行看简历20秒就定

企业招人有什么偏好?网上各种“求职攻略”对不对?一线的人事经理最有发言权。昨天,作为“江苏人才服务进校园”活动的一部分,多位企业HR(Human Resource人力资源)经理走进了校园,以自己实际工...

字符串遍历生成器。。。(改个名字行不行?

# -*- coding: utf-8 -*- """ Created on Sun Aug 10 11:12:35 2014 @author: aminic """ class Password...
  • aminic
  • aminic
  • 2014年08月11日 09:29
  • 404

为生活可以忍,侮辱技术行不行?

原文出处: 沈逸(@沈逸_程序员在囧途_创办者)    几年前追《叶问》,当我看到叶问2时就被洪金宝的一句话给震撼住了:“为生活可以忍,侮辱中国武术就不行”。 前段时间我也听到了类似一...

为生活可以忍,侮辱技术行不行?(转载)

为生活可以忍,侮辱技术行不行? 2014-06-06 10:34:24 标签:中国武术 项目经理 洪金宝 项目管理 侮辱技术 原创作品,允许转载,转载时请务必以超链接形式标明文章 原...
  • root314
  • root314
  • 2014年06月13日 00:42
  • 426

网页制作没有什么行不行的

一、网页制作没有什么行不行的,不是什么东西一定要老师教,只不过有老师引导入门要快一些。但是自学也是一样,只不过是要多花些时间和精力。能否学好并不是看你的基础如何。而是看你是不是真的想学,有信心学,知难...

VR火得不行 那么它商业化的突破点到底在哪里?

VR,即Virtual Reality,中文叫做虚拟现实,是利用运算平台模拟产生三维的虚拟世界,让使用者脱离现实世界,及时、没有限制地感知虚拟空间内的事物。   VR设备通过视觉、听觉、触觉、嗅觉、...
  • arvin0
  • arvin0
  • 2016年03月11日 10:29
  • 145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-TextView的includeFontPadding到底行不行
举报原因:
原因补充:

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