Android中FontMetrics的几个属性全面讲解

作者:jingxian 时间:2023-11-14 14:57:20 

今天和大家聊一聊Android中关于FontMetrics的几个属性的理解,在Android中用画笔绘制文字时,文字最终的大小是和绘制文字的字体的类型和字体的大小是相关的。

设置字体类型 Paint.setTypeface(Typeface typeface)

设置字体大小 Paint.setTextSize(float textSize)

Paint.FontMetrics有5个属性,并且这5个属性都是跟字体相关的,下面是官方API文档的解释:

Android中FontMetrics的几个属性全面讲解

翻译一下他的意思:

1. 基准点是baseline

2. Ascent是baseline之上至字符最高处的距离

3. Descent是baseline之下至字符最低处的距离

4. Leading文档说的很含糊,其实是上一行字符的descent到下一行的ascent之间的距离

5. Top指的是指的是最高字符到baseline的值,即ascent的最大值

6. 同上,bottom指的是最下字符到baseline的值,即descent的最大值

网上还有另一种翻译方式:

top: 字体中字符超出基线之上的最大距离

bottom: 字体中字符超出基线之下的最大距离

ascent: 单个字符超出基线之上的推荐距离

descent: 单个字符超出基线之上的推荐距离

leading: 标准行间距

其实翻译完之后还是很难理解具体是什么意思,所以我找来下面几个图认识一下:

Android中FontMetrics的几个属性全面讲解

注意,以上获取到的属性值,是相对于baseline的坐标值,而不是距离值。

字体的高度可以通过descent+Math.abs(ascent)计算得到。字符串的宽度可以通过Paint.measureText("xxxx")得到。注意,如果所选字体为等宽字体,则每个字符的宽度相等,如果非等宽字体,则字符宽度并不相同。

字符串的实际可视高度和宽度,即最小包围框则可以通过Paint.getTextBounds()或者TextView.getLineBounds()获得,如下图所示:

Android中FontMetrics的几个属性全面讲解

Paint.getTextBounds

这个方法获取字符[字符串]占据的矩形区域,意为字体可见部分的矩形区域

Rect bound = new Rect();

mPaint.getTextBounds(text, 0, text.length(), bound);

bound.right - bound.left //得到的就是字符[字符串]的可见部分矩形区域的宽度

Paint.measureText(text)

返回的是字符[字符串]的宽度,注意与

bound.right - bound.left相互区分.

因为通常来说每个字符两边都会留有一部分空白区域,便于阅读.所以measureText的尺寸通常会大于bound.right - bound.left.所以,对于单个字符来说:

measureText = bound.right - bound.left + 字符两边的留白宽度

下面再来说一说行高的计算方式:

字符所在行的高度 = ascent + descent + leading,即字符的高度+行间距,可以通过descent+Math.abs(ascent) + leading计算得到。对于TextView中的行高,可以直接通过getLineHeight()方法获取。

其实到这里理不理解都没有关系,在平常的开发中主要会用到获取字符或字符串宽度和高度,我们只需要知道他们的获取方式即可

宽度获取方法:Paint.measureText(text)

高度获取方法:descent+Math.abs(ascent)

以上所说都是个人理解,欢迎大家吐槽纠正!

标签:android,fontmetrics
0
投稿

猜你喜欢

  • 英语单词state与status的区别

    2021-09-04 13:57:34
  • Java 中的字符串常量池详解

    2023-08-15 04:43:45
  • C语言实现自定义扫雷游戏(递归版)

    2023-11-03 02:12:36
  • Android实现通讯录效果——获取手机号码和姓名

    2021-10-25 11:53:59
  • newtonsoft.json解析天气数据出错解决方法

    2022-03-10 12:23:21
  • SpringCloud Eureka搭建的方法步骤

    2021-10-10 11:03:29
  • Java map存放数组并取出值代码详解

    2023-06-27 23:32:18
  • Android发布项目到jitpack的完整步骤

    2021-11-29 08:42:10
  • Android 实现当下最流行的吸顶效果

    2021-12-30 18:46:33
  • 如何利用Java输出链表中倒数第k个结点

    2022-11-29 10:13:28
  • Android开发input问题解决分析

    2021-11-10 08:58:46
  • SpringBoot异步与事务一起使用的问题解决

    2023-03-17 07:11:08
  • java实现分布式项目搭建的方法

    2022-10-13 10:42:36
  • java并发编程专题(一)----线程基础知识

    2021-10-30 00:28:42
  • Android 捕获错误日志的方法

    2021-06-16 16:24:44
  • 如何利用反射生成 MyBatisPlus中QueryWrapper动态条件

    2021-10-20 14:59:40
  • Java实现根据模板自动生成新的PPT

    2022-10-22 18:31:31
  • Springboot导出文件,前端下载文件方式

    2023-07-21 11:27:05
  • 基于Java+SpringBoot+Vue前后端分离实现仓库管理系统

    2023-11-01 04:21:22
  • 基于javaMybatis存进时间戳的问题

    2023-11-29 02:55:51
  • asp之家 软件编程 m.aspxhome.com