Android 基本属性绘制文本对象FontMetrics

news2024/10/6 12:24:50

FontMetrics对象


它以四个基本坐标为基准,分别为:

・FontMetrics.top
・FontMetrics.ascent
・FontMetrics.descent
・FontMetrics.bottom

如图:

要点如下:
1. 基准点是baseline
2. Ascent是baseline之上至字符最高处的距离
3. Descent是baseline之下至字符最低处的距离
4. Leading文档说的很含糊,其实是上一行字符的descent到下一行的ascent之间的距离
5. Top指的是指的是最高字符到baseline的值,即ascent的最大值
6. 同上,bottom指的是最下字符到baseline的值,即descent的最大值

 测试

public class FontMetricsDemoActivity extends Activity { 
    private Canvas canvas; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG); 
        textPaint.setTextSize( 55); 
        textPaint.setColor( Color.WHITE); 

        // FontMetrics对象 
        FontMetrics fontMetrics = textPaint.getFontMetrics(); 
        String text = "abcdefghijklmnopqrstu"; 



        // 计算每一个坐标 
        float baseX = 0; 
        float baseY = 100; 
        float topY = baseY + fontMetrics.top; 
        float ascentY = baseY + fontMetrics.ascent; 
        float descentY = baseY + fontMetrics.descent; 
        float bottomY = baseY + fontMetrics.bottom; 
        float leading = baseY + fontMetrics.leading; 


        Log.d("fontMetrics", "baseX    is:" + 0); 
        Log.d("fontMetrics", "baseY    is:" + 100); 
        Log.d("fontMetrics", "topY     is:" + topY); 
        Log.d("fontMetrics", "ascentY  is:" + ascentY); 
        Log.d("fontMetrics", "descentY is:" + descentY); 
        Log.d("fontMetrics", "bottomY  is:" + bottomY); 
        Log.d("fontMetrics", "leading  is:" + leading); 



        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fontmetrics); 
        Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); 

        canvas  = new Canvas(mutableBitmap); 



        // 绘制文本 
        canvas.drawText(text, baseX, baseY, textPaint); 

        // BaseLine描画 
        Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); 

        baseLinePaint.setColor( Color.RED); 
        canvas.drawLine(0, baseY, canvas.getWidth(), baseY, baseLinePaint); 

        // Base描画 
        canvas.drawCircle( baseX, baseY, 5, baseLinePaint); 

        // TopLine描画 
        Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); 
        topLinePaint.setColor( Color.LTGRAY); 
        canvas.drawLine(0, topY, canvas.getWidth(), topY, topLinePaint); 

        // AscentLine描画 
        Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); 
        ascentLinePaint.setColor( Color.GREEN); 
        canvas.drawLine(0, ascentY, canvas.getWidth(), ascentY, ascentLinePaint); 

        // DescentLine描画 
        Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); 
        descentLinePaint.setColor( Color.YELLOW); 
        canvas.drawLine(0, descentY, canvas.getWidth(), descentY, descentLinePaint); 

        // ButtomLine描画 
        Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG); 
        bottomLinePaint.setColor( Color.MAGENTA); 
        canvas.drawLine(0, bottomY, canvas.getWidth(), bottomY, bottomLinePaint);  

        ImageView imageView = (ImageView) findViewById(R.id.imageView1); 
        imageView.setImageBitmap(mutableBitmap); 

    } 
}

 结果是这样的:

 

由图中我们发现它fontMetrics.leading不会返回结果出来,而且,fontMetrics.top跟fontMetrics.ascent值接近,甚至一样,fontMetrics.descent跟fontMetrics.bottom值接近,甚至一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1201294.html

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

相关文章

【多线程 - 03、线程的生命周期】

生命周期 当线程被创建并启动以后,它不是一启动就进入执行状态,也不会一直处于执行状态,而是会经历五种状态。 线程状态的五个阶段: 新建状态(New)就绪状态(Runnable)运行状态&…

TensorFlow学习笔记--(3)张量的常用运算函数

损失函数及求偏导 通过 tf.GradientTape 函数来指定损失函数的变量以及表达式 最后通过 gradient(%损失函数%,%偏导对象%) 来获取求偏导的结果 独热编码 给出一组特征值 来对图像进行分类 可以用独热编码 0的概率是第0种 1的概率是第1种 0的概率是第二种 tf.one_hot(%某标签…

【差旅游记】启程-新疆哈密(1)

哈喽,大家好,我是雷工。 最近有个新疆罗布泊的项目要去现场,领导安排我过去,这也算第一次到新疆,记录下去新疆的过程。 01、天有不测风云 本来预定的是11月2号石家庄飞成都,成都转机到哈密,但…

为什么要用“交叉熵”做损失函数

大家好啊,我是董董灿。 今天看一个在深度学习中很枯燥但很重要的概念——交叉熵损失函数。 作为一种损失函数,它的重要作用便是可以将“预测值”和“真实值(标签)”进行对比,从而输出 loss 值,直到 loss 值收敛,可以…

Linux--gcc/g++

一、gcc/g是什么 gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C、java、Pascal等语言。gcc支持多种硬件平台 二、gc…

【Pytorch和深度学习】栏目导读

一、栏目说明 本栏目《pytorch实践》是为初学者入门深度学习准备的。本文是该栏目的导读部分,因为计划本栏目在明年完成,因此,导读部分,即本文也在持续更新中。 本栏目设计目标是将深度学习全面用pytorch实践一遍,由浅…

2390 高校实验室预约系统JSP【程序源码+文档+调试运行】

摘要 本文介绍了一个高校实验室预约系统的设计和实现。该系统包括管理员、教师和学生三种用户,具有基础数据管理、学生管理、教师管理、系统公告管理、实验室管理、实验室预约管理和系统管理等模块。通过数据库设计和界面设计,实现了用户友好的操作体验…

std::any

一、简介 std::any 可以储存任何可拷贝构造和可销毁的类型的对象。 struct test {test(int a,int b){} };int main(int argc, char *argv[]) {std::any a 1;qDebug() << a.type().name();a 3.14;qDebug() << a.type().name();a true;qDebug() << a.type…

PyCharm 安装库时显示连接超时

在setting->python Interpreter 中用“” 安装库时&#xff0c;出现一个弹窗&#xff0c;提示信息如下&#xff1a; Error updating package list: Connect timed out 通过查阅资料&#xff0c;发现是镜像源的问题&#xff0c;具体的解决方案如下&#xff1a; 1. 更新一下…

阿里云国际站:云备份

文章目录 一、阿里云云备份的概念 二、云备份的优势 三、云备份的功能 四、云备份的应用场景 一、阿里云云备份的概念 云备份作为阿里云统一灾备平台&#xff0c;是一种简单易用、敏捷高效、安全可靠的公共云数据管理服务&#xff0c;可以为阿里云ECS整机、ECS数据库、文件…

代码分析之-广东省公共资源交易平台

广东省公共资源交易平台 hex: function Xq() {return bg || (bg 1,function(e, t) {(function(n, u) {e.exports u()})(an, function() {var n n || function(u, o) {var r;if (typeof window < "u" && window.crypto && (r window.crypto)…

[工业自动化-15]:西门子S7-15xxx编程 - 软件编程 - 硬件组态进行硬件配置与信号模块的分配、信号数据类型

目录 一、PLC组态在PLC编程中的位置&#xff1a;首要位置 1.1 什么是硬件组态 1.2 硬件组态在PLC编程中的位置 二、硬件组态的步骤&#xff1a; 三、信号模块的分配 3.1 what什么是PLC信号模块的地址&#xff0c;以及信号模地址的格式&#xff1f; 3.2 whyPLC信号模块地…

“苹果定律”失效,2023是VR的劫点还是拐点?

因为Pico裁员的事情&#xff0c;VR行业又被讨论了。 Pico于2021年9月被字节跳动收购&#xff0c;当时是出货量排名全球第三的VR 头显生产商。 此前曾有国际机构预测&#xff0c;2023年随着Meta和Pico的硬件更新&#xff0c;苹果Vision Pro的推出&#xff0c;三星电子重新回归VR…

[工业自动化-17]:西门子S7-15xxx编程 - 软件编程 - PLC编程语言以及与嵌入式编程的比较

目录 一、博图编程语言 1.1 概述 1.2 三种编程语言之间的关系 二、PLC与嵌入式系统的类比 三、PLC编程与嵌入式系统编程的比较 3.1 不同点 3.2 相同点 3.3 PLC是一种专门用于工业控制系统的嵌入式系统 一、博图编程语言 1.1 概述 西门子&#xff08;Siemens&#xff0…

CentOS指令学习

目录 一、常用命令 1、ls 2、cd_pwd 3、touch_mkdir_rmdir_rm 4、cp_mv 5、whereis_which_PATH 6、find 7、grep 8、man_help 9、关机与重启 二、压缩解压 1、zip_unzip 2、gzip_gunzip 3、tar 三、其他指令 1、查看用户登录信息 2、磁盘使用情况 3、查看文件…

【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

【Spring Boot 源码学习】初识 SpringApplication

Spring Boot 源码学习系列 初识 SpringApplication 引言往期内容主要内容1. Spring Boot 应用程序的启动2. SpringApplication 的实例化2.1 构造方法参数2.2 Web 应用类型推断2.3 加载 BootstrapRegistryInitializer2.4 加载 ApplicationContextInitializer2.5 加载 Applicatio…

解决删除QT后Qt VS Tools中Qt Options中未删除的错误

在Qt VS Tools的Qt Options已经配置好Qt Versions后如果删除QT程序之后会出现Default Qt/Win version任然存在&#xff0c;这是如果再添加一个话就不能出现重名了&#xff0c;如果新建一个其他名字的话其实在vs中还是不能正常运行qt&#xff0c;会出现点击ui文件vs会无故重启或…

RK3568平台开发系列讲解(Linux系统篇)Linux 目录结构

🚀返回专栏总目录 文章目录 一、VFS二、分区结构三、挂载 mount四、目录结构沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们从目录管理入手,会更直观的理解 linux 的目录结构。 一、VFS Linux 所有的文件都建立在虚拟文件系统(Virtual File System ,VFS…

Please No More Sigma(构造矩阵)

Please No More Sigma 给f(n)定义如下&#xff1a; f(n)1 n1,2; f(n)f(n-1)f(n-2) n>2; 给定n&#xff0c;求下式模1e97后的值 Input 第一行一个数字T&#xff0c;表示样例数 以下有T行&#xff0c;每行一个数&#xff0c;表示n。 保证T<100&#xff0c;n<100000…