关于Android中FontMetrics的几个属性讲解

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

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

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

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


翻译一下他的意思:

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: 标准行间距
其实翻译完之后还是很难理解具体是什么意思,所以我找来下面几个图认识一下:

注意,以上获取到的属性值,是相对于baseline的坐标值,而不是距离值。
字体的高度可以通过 descent+Math.abs(ascent)计算得到。字符串的宽度可以通过 Paint.measureText("xxxx")得到。注意,如果所选字体为等宽字体,则每个字符的宽度相等,如果非等宽字体,则字符宽度并不相同。
字符串的实际可视高度和宽度,即最小包围框则可以通过 Paint.getTextBounds()或者 TextView.getLineBounds()获得,如下图所示:


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)
以上所说都是个人理解,欢迎大家吐槽纠正!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio 实现通讯录将名字首个字母作为头像的功能,可以按照以下步骤进行操作: 1. 首先,确保你的项目已经包含了适当的用户信息,例如姓名。 2. 创建一个头像生成器的帮助类,用于将首个字母转换为头像。可以使用一个自定义的 drawable 或者使用第三方库来生成圆形头像。以下是一个示例代码: ```java public class AvatarGenerator { public static Bitmap generateAvatar(String name, int width, int height) { // 从名字获取首字母 String initial = String.valueOf(name.charAt(0)); // 使用画布绘制圆形头像 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setColor(Color.BLUE); // 设置头像背景颜色 canvas.drawCircle(width / 2, height / 2, width / 2, paint); // 绘制首字母在头像心 paint.setColor(Color.WHITE); // 设置字母颜色 paint.setTextSize(width / 2); // 设置字母大小 paint.setTextAlign(Paint.Align.CENTER); Paint.FontMetrics fontMetrics = paint.getFontMetrics(); float baseline = (height - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top; canvas.drawText(initial, width / 2, baseline, paint); return bitmap; } } ``` 3. 在适配器或者界面的代码,根据每个用户的姓名生成对应的头像,并将其设置给相应的 ImageView。以下是一个示例代码: ```java // 获取用户的姓名 String name = "John Doe"; // 根据姓名生成头像 Bitmap avatar = AvatarGenerator.generateAvatar(name, 100, 100); // 将头像设置给 ImageView imageView.setImageBitmap(avatar); ``` 在这个示例,我们使用 `AvatarGenerator.generateAvatar()` 方法根据姓名生成一个圆形头像,并将其设置给 `imageView`。 这样,你就可以将通讯录每个联系人的名字首字母作为其头像显示在界面上了。你可以根据实际需求进行定制和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值