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

news2024/12/23 9:49:33

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.coloradmin.cn/o/563918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Revit技巧 | Revit中图元不可见怎么办?

在revit中,控制图元课件性的设置有很多种,因此图元不可见,也会有各种各样的原因,这也是经常困扰新手的问题,下面我把这些解决办法做一些归纳总结。 图元如果过远偏离当前视图的中心,将导致视图不可见这时&…

MySQL:数据库的查询与连接

目录 1.复合查询 1.1 多表查询(联合查询) 1.2 join on (inner join) 1.3 自连接 1.4 子查询 1.5 合并查询 2.内外连接 3.关于高内聚、低耦合 1.复合查询 1.1 多表查询(联合查询) 什么是多表插叙?实际开发中往…

网络安全管理员证书有什么用?2023证书怎么考?证书报考条件?

网络安全管理员是做什么工作的呢?现如今,网络高速发展,带动了很多行业的兴起,比如说电商行业,今天已经步入到足不出户即可购物的时代了,当然网络也是一把“双刃剑”,带来了好处的同时&#xff0…

Sui Move Object讲解

要了解Sui的独特特性,首先要了解Sui中以对象为中心的数据模型。 Sui的设计初衷是重新定义数字资产所有权的可能性。重新设计的一个基本部分 — — Sui是以对象为中心的数据模型,也是Sui和其他Layer 1区块链之间的一个显著区别。 其他L1如何处理资产所有…

day8 - 使用不同的滤波核进行图像降噪

本期主要介绍用于图像平滑处理的滤波,分别是方框滤波、均值滤波、中值滤波、高斯滤波,比较不同滤波的效果;并了解自定义滤波器进行图像处理。 完成本期内容,你可以: 会使用方框滤波、均值滤波、中值滤波、高斯滤波进行…

实时聊天组合功能,你了解吗?

你有兴趣安装实时聊天组合功能吗?如果您选择了SaleSmartly(ss客服),您的实时聊天插件可以不仅仅只是聊天通道,还可以有各种各样的功能,你不需要包含每一个功能,正所谓「宁缺勿滥」,功…

Windows主机中构建适用于K8S Operator开发环境

基于 win 10 打造K8S应用开发环境 一、wsl子系统安装 在cmd命令行终端或powershell中操作 1.1 确认windows操作系统版本 1.2 开启wsl功能 1.3 wsl配置 PS C:\Users\cpf> wsl提示:适用于 Linux 的 Windows 子系统没有已安装的分发版。可以通过访问 Microsoft St…

使用canvas给图片添加水印

上接文章“图片处理” canvas元素其实就是一个画布,我们可以很方便地绘制一些文字、线条、图形等,它也可以将一个img标签里渲染的图片画在画布上。 我们在上传文件到后端的时候,使用input标签读取用户本地文件后得到的其实是一个Blob对象&a…

Redis7实战加面试题-基础篇(Redis持久化,Redis事务,Redis管道,Redis发布订阅)

Redis持久化 RDB (Redis DataBase) RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使…

HCIA-ARP、MAC、交换机工作原理

目录 万能数据转发模型 ARP协议:地址解析协议 以太网帧的交换 IP地址和Mac地址的区别: 以太网交换机介绍: 交换机的工作原理: ​编辑交换机处理数据的三种方式: Mac表和ARP表的区别: 万能数据转发模…

自定义注解和@Target、@Retention注解的使用

说明:注解可以理解为另一种形式的配置,可用于在类上、方法上等,标志是“”,如重写方法上的“Override”就是一种注解。这里我通过一个实例,来介绍自定义注解和java元注解(Target、Retention)的使…

案例20:Java物流管理系统设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

ChatGPT全球最大开源平替OpenAssistant:基于Pythia和LLaMA微调而来

论文地址:https://drive.google.com/file/d/10iR5hKwFqAKhL3umx8muOWSRm7hs5FqX/view 项目地址:https://github.com/LAION-AI/Open-Assistant 数据集地址:https://huggingface.co/datasets/OpenAssistant/oasst1 体验地址:http…

Hiredis的基本使用

目录 前言 一.hiredis的安装 二.同步API 2.1.连接Redis数据库 2.1.1 无超时时间,阻塞等待连接 2.1.2 设置超时时间,阻塞等待连接。 2.1.3 非阻塞,不管连接与否,立即返回。 2.2.执行命令 2.2.1 返回执行上下文 2.2.2 没有返回执…

伪类元素的用法总结

1:自闭标签不适用伪类元素 自闭合标签 1. 一般标签   由于有开始符号和结束符号&#xff0c;因此可以在内部插入其他标签或文字。 <p>“绿叶&#xff0c;给你初恋般的感觉。”</p> 2. 自闭合标签   由于只有开始符号而没有结束符号&#xff0c;因此不可以在内…

2023-05-24:为什么要使用Redis做缓存?

2023-05-24&#xff1a;为什么要使用Redis做缓存&#xff1f; 答案2023-05-24&#xff1a; 缓存的好处 买啤酒和喝啤酒的例子可以帮助我们理解缓存的好处。 假设你在超市里买了一箱啤酒&#xff0c;如果你需要每次想喝啤酒就去超市购买&#xff0c;无疑会浪费很多时间和精力…

vue+element纯手工完美模拟实现小米有品网站

一、预览 小米有品官网&#xff1a;小米有品 本作品demo预览地址&#xff1a;点击预览 二、效果图对比 1.官方效果截图&#xff1a; 2.作者实现的demo效果图&#xff1a; 首页&#xff1a; 上新精选&#xff1a; 商品详情&#xff1a; 购物车&#xff1a; 登录&#xff1a; …

【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering(分离对比协同过滤)

【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering&#xff08;分离对比协同过滤&#xff09; 文章目录 【论文阅读】23_SIGIR_Disentangled Contrastive Collaborative Filtering&#xff08;分离对比协同过滤&#xff09;1. 来源2. 介绍3. 模型方法3.1…

最小生成树 Prim算法实现(c语言代码)

【问题描述】 城市之间的公路交通可以用一个无向图表示。如下图所示&#xff1a; 顶点表示城市、边表示城市之间有公路相连&#xff0c;边上的权值表示城市之间的公路长度。 编程解决以下问题&#xff1a; &#xff08;1&#xff09;输入城市信息和城市之间公路的信息&…

2023最新SRC漏洞挖掘快速上手攻略!

前言 随着网络安全的快速发展&#xff0c;黑客攻击的手段也越来越多样化&#xff0c;因此SRC漏洞挖掘作为一种新的网络安全技术&#xff0c;也在不断发展和完善。那么&#xff0c;作为一个网安小白如果想要入门SRC漏洞挖掘&#xff0c;需要掌握哪些知识呢&#xff1f;以下是本…