Android中静态和动态文字的绘制和测量

news/2024/12/3 5:00:11/

Android中静态和动态文字的绘制和测量

Android中自定义视图的时候存在两种情况,静态文字动态文字

顾名思义,静态文字就是显示内容是固定的,不会产生变化的文字,而动态文字则是内容会不断产生变化的文字信息。

在说明为什么要在绘制文字的时候区分静态文字和动态文字之前,我们需要首先讲一讲,静态文字的测量和绘制方式,静态文字的绘制我们需要基于静态文字的边框来决定。

在我们调用drawText时,系统api会根据paint.textAlign基准点的基础上,基于基线进行绘制,文字的基线往往在文字的底部,所以如果将基准点设置为视图的中心,那么就难免会造成文字整体绘制位置过于偏上的问题。这个时候就需要基于文字的测量边框来适当进行基准点的偏移了。

请注意,这里rect.toprect.bottom都是相对于基线的偏移量(可能为负值,表示文字顶部或者底部在基线的上面),而不是我们文字在屏幕中的相对坐标原点的距离,因为调用getTextBounds的时候,我们还没有绘制文字呢?那系统又怎么知道我们打算到哪里去绘制文字呢?所以解决我们上述所说的文字整体向上偏移的问题,我们只需要将基准点向下移动,文字中心线和baseline的差值即可。

基本的操作流程如下:

val s = "abp"//待绘制的文字
val rect: Rect = Rect()//用于存储边框信息的容器
paint.getTextBounds(s, 0, s.length, rect)//获取文字的边框并存储到容器里
paint.textAlign = Paint.Align.CENTER//文字基于指定坐标居中显示
canvas.drawText(s, 0, s.length, centerX, centerY - (rect.top + rect.bottom) / 2, paint)//基于文字定义的边框进行文字绘制的偏移

好了,说完了静态文字的绘制问题,我们来讲讲为什么要对静态问题和动态文字进行分开处理。

之所以要对于这两种情况需要区分处理,是因为像英语这样的语言,其不像汉字一样,大多数是方块字,都基本能够填充满整个格子。像英语这样的语言,为了其显示内容的美观,其内容文字多多少少会产生各种各样的偏移,从而让其文字的主要部分居中对齐显示,比如说,b和p两个字母中的“圆圈O”部分对齐我们才会觉得显示是十分自然和好看的。

也正因此,当一串文字一直发生变动时,对于同一个字母,如果还是按照静态文字那一套,就会发生字母一直在上下晃动的问题。那么如何解决这个问题呢?我们需要采取一个折衷的方式来解决对应的问题了。在分析文字的时候,官方给出了对应的API:paint.getFontMetrics(fontMetrics)来获取字体的相关配置,通过API我们可以获取到文字的主体部分的topbottom,为了区分,官方将其分别命名为ascentdescent。我们只需要按照之前的方式根据字体的ascentdecent来对绘制基准点进行偏移即可完成对应的文字绘制。

文字对准线

基本的绘制流程如下:

val fontMetrics = Paint.FontMetrics()
paint.getFontMetrics(fontMetrics)
val newBaseLine = (fontMetrics.descent + fontMetrics.ascent) / 2
canvas.drawText(s, 0, s.length, centerX, centerY - newBaseLine, paint)

好了,自定义视图的文字绘制基本内容差不多就是这么多了,这部分内容还有另外一个,就是如何自定义视图实现文字环绕图片的效果


http://www.ppmy.cn/news/78564.html

相关文章

Android 12.0根据包名授予读取IMEI权限

1.概述 在12.0的产品开发中,对于读取设备的imei sn号功能也是常有的,而在10.0以后对于读取imei也是受权限要求越来越多了一般的app是读取不到这个权限了,根据产品需求需要读取这个权限,所以需要在系统中对这个app授权让它读取包名,从而实现功能 2.根据包名授予读取IMEI权…

Windows:设置右键用RStudio打开文件和文件夹

0. 前言 在使用RStudio写R脚本的时候总是要先打开它,再通过它打开脚本和文件夹,感觉不是很方便。由于VSCode以及其他软件都可以整合到右键菜单中打开文件或文件夹,因此就折腾了一下怎么在右键中使用RStudio打开文件,下面是效果展…

【Linux】Linux开发工具vim

Linux开发工具vim 什么是vim三种模式的转换vim的基本命令gg:定位光标到最开始的行Shiftg:定位光标到结尾行nShiftg:定位光标到任意行Shift$:定位光标到当前行结尾Shift^:定位光标到当前行开始w,b:光标按照单词进行行内…

在vue3中如何使用百度地图API(详细步骤+demo示例)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、注册账号、申请成为开发者二、申请密钥AK三、在vue3.0中使用百度地图API 提示:以下是本篇文章正文内容,下面案例可供参考 一、注册账号…

进程和编码

一、python代码的运行方式 1.脚本式 2. 交互式 一般用于代码的测试 二、进制及相互之间的转换 1. 进制 2.进制之间相互转换 在python中,十进制是以整形的形式存在,其他进制是已字符串的形式存在。 二进制/八进制/十六进制都可与十进制相互转换。但…

RES 新的数据集 Advancing Referring Expression Segmentation Beyond Single Image 论文笔记

RES 新的数据集 Advancing Referring Expression Segmentation Beyond Single Image 论文笔记 一、Abstract二、引言三、相关工作3.1 Referring Expression Segmentation (RES)3.2 CoSalient Object Detection (CoSOD) 四、提出的方法4.1 概述文本 & 图像编码器TQM & H…

C嘎嘎~~[类 中篇]

类 中篇 6.类的实例化7.类对象模型8.this指针8.1this指针是什么8.2this指针的特性 6.类的实例化 什么叫类的 实例化?? 首先, 我们应该关注这个"实" — 实际存在的, 它的反义词是 “虚” — 不存在的. > 类中的成员变量是虚的(相当于声明), 在类外面创建的对象是…

lftp安装、使用

介绍 lftp 是一个功能强大的下载工具。lftp的界面非常想一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。是一个基于命令行的文件传输软件(…