文章目录

  • I . 文字尺寸测量
  • II . 基线绘制

I . 文字尺寸测量


1 . 精准绘制需求 : Canvas 绘制文字时 , 有时需要精准的控制文字的绘制 , 如绘制到指定的区域 , 居中 , 或者位于某个精准的坐标 ;

2 . 精准测量 : 要实现精准绘制 , 必须对字符串绘制的区域有详细的测量 , 如字符串绘制的 宽度 , 高度 等信息时必须知道的 ;

3 . 测量文字宽度 ( 粗略 ) : 调用 Paint 的 measureText ( ) 方法 , 可以测量整体宽度 ;

//1 . 创建画笔
Paint paint = new Paint();
//2 . 要绘制的字符串
String text = "ABCD";//3 . 测量宽度
float textWidth = paint.measureText(text);//4 . 打印测量结果 : textWidth : 32.0
Log.i(TAG, "textWidth : " + textWidth);

4 . 测量文字每个字符的宽度 ( 精确 ) : 调用 Paint 的 getTextWidths ( ) 方法 , 可以测量每个字符的宽度 ;

//1 . 创建画笔
Paint paint = new Paint();
//2 . 要绘制的字符串
String text = "ABCD";//3 . 获取 从第 0 个开始 , text.length() 个字符 , 每个字符的宽度 , 将其存储到 widths 数组中
float[] widths = new float[text.length()];
paint.getTextWidths(text, 0, text.length(), widths);//4 . 打印测量结果 : widths[0] : 8.0 , widths[1] : 8.0 , widths[2] : 8.0 , widths[3] : 8.0
Log.i(TAG, "widths[0] : " + widths[0] +" , widths[1] : " + widths[1] +" , widths[2] : " + widths[2] +" , widths[3] : " + widths[3]);

5 . 测量文字矩形区域 ( 推荐 ) : 调用 Paint 的 getTextBounds ( ) 方法 , 可以测量字符串绘制的矩形区域 , 可以获取其宽度 , 高度 , 左上右下 等信息 ;

//1 . 创建画笔
Paint paint = new Paint();//2 . 要绘制的字符串
String text = "ABCD";//3 . 测量结果载体
Rect rect = new Rect();//4 . 测量绘制字符串的矩形区域 , 将测量结果放入 rect 对象中
paint.getTextBounds(text,0, text.length(), rect);//5 . 打印结果 : rect : Rect(0, -9 - 31, 0)
Log.i(TAG, "rect : " + rect);

II . 基线绘制


1 . 隐含的五条线 : 使用 Canvas 绘制的字符串 , 每个绘制的字符串 , 都隐含五条线 :

① Top 线 : 字符串绘制最顶部 , 不会超过该线 ;

② Asent 线 : 字母的最高点 ;

③ Baseline 线 : 文字绘制的基线 ;

④ Descent 线 : 字母的最低点 ;

⑤ Bottom 线 : 字符串绘制最顶部 , 不会低于该线 ;

2 . 获取上述除基线外的四个值 : 注意这几个值的加减关系 , 每条线的值减去基线的值 , 有正数 , 有负数 ;

FontMetrics fontMetrics = mPaint.getFontMetrics();//Top - Baseline : top : -12.673828
fontMetrics.top;//Ascent - Baseline : ascent : -11.1328125
fontMetrics.ascent;//Descent - Baseline : descent : 2.9296875
fontMetrics.descent;//Bottom - Baseline : bottom : 3.2519531
fontMetrics.bottom;

4 . 相关数的正负值 :

基线的位置是 0 : Baseline = 0 ;

每个值的正负 : 高于基线的大于 0 , 小于基线的小于 0 ; 即 Top 和 Asent 是小于 0 的数 ; Descent 和 Bottom 是大于 0 的数 ;

5 . 已知顶端位置绘制字符串 :

Baseline + Top = 绘制字符串最顶端值 ;

Baseline = 绘制字符串最顶端值 - Top ;

此时 , 如果已知绘制的最顶端的值 , 调用 drawText 方法 , 需要传入一个基线值 , 此时就需要用到 “Baseline = 绘制字符串最顶端值 - Top” 公式了 ;

下面是在 ( 0 , 100 ) 坐标系位置绘制字符串 , 字符串的左上角是 ( 0 , 100 ) 坐标 ;

//创建画笔
Paint paint = new Paint();
//要绘制的字符串
String text = "ABCD";//打印四个值 :
//top : -12.673828 , leading : 0.0 , ascent : -11.1328125 , descent : 2.9296875 , bottom : 3.2519531
L.i(TAG, "top : " + paint.getFontMetrics().top +" , leading : " + paint.getFontMetrics().leading +" , ascent : " + paint.getFontMetrics().ascent +" , descent : " + paint.getFontMetrics().descent +" , bottom : " + paint.getFontMetrics().bottom);//计算出文字基线的值
float baseline = 100 - paint.getFontMetrics().top;//在 ( 0 , 100 ) 坐标系位置绘制字符 , 字符串的左上角是 ( 0 , 100)
canvas.drawText(text , 0, baseline , paint);

下面的图片仅供参考 :

【Android 应用开发】Canvas 绘制文字 ( 文字尺寸测量 | 基线绘制 )相关推荐

  1. Android画板开发(二) 橡皮擦实现

    Android画板开发(一) 基本画笔的实现 Android画板开发(二) 橡皮擦实现 Android画板开发(三) 撤销反撤销功能实现 Android画板开发(四) 添加背景和保存画板内容为图片 A ...

  2. Android画板开发(四) 添加背景和保存画板内容为图片

    Android画板开发(一) 基本画笔的实现 Android画板开发(二) 橡皮擦实现 Android画板开发(三) 撤销反撤销功能实现 Android画板开发(四) 添加背景和保存画板内容为图片 A ...

  3. Android画板开发(一) 基本画笔的实现

    Android画板开发(一) 基本画笔的实现 Android画板开发(二) 橡皮擦实现 Android画板开发(三) 撤销反撤销功能实现 Android画板开发(四) 添加背景和保存画板内容为图片 A ...

  4. 【Android 应用开发】Canvas 精准绘制文字 ( 文本边界坐标解析 | 绘图位置 )

    文章目录 一.文本边界坐标解析 二.绘图位置 一.文本边界坐标解析 在上一篇博客 [Android 应用开发]Canvas 精准绘制文字 ( 测量文本真实边界 | 将文本中心点与给定中心点对齐 ) 中 ...

  5. android 文字闪烁效果,Android Shader应用开发之霓虹闪烁文字效果

    本文实例为大家分享了android霓虹闪烁文字效果的具体代码,供大家参考,具体内容如下 package com.example.apple.shaderdemo; import android.con ...

  6. Android深入理解文字绘制:FontMetrics字体测量及其TextPaint介绍

    文章目录 TextPaint介绍 一.FontMetrics 1.1 理论知识 1.2 代码验证 1.3 fontMetrics中的变量和文字的size.typeface有关 1.4 绘制居中屏幕的文 ...

  7. canvas绘制的文字如何换行

    <html><head><title>canvas绘制的文字如何换行</title><style type="text/css" ...

  8. android应用开发-从设计到实现 2-4 文字的使用

    文字的使用 文字是应用当中使用最多的要素.显示一段供用户阅读的文字,程序运行时的信息提示都离不开它. 文字是内容的实际体现者,因此设计师需要将用户的注意力尽可能的吸引到文字当中. 字体可以分成两种类型 ...

  9. html像素绘制文字,HTML5 - Canvas的使用样例10(绘制文本)

    1,设置绘图上下文的font属性 (1)设置字体大小(像素)和字体名称 context.font = "22px Arial"; (2)为了适应多个浏览器,字体名字可以多列几种 c ...

最新文章

  1. 混合云存储开启企业上云新路径--阿里云混合云备份容灾方案发布
  2. 微信公众号开发之获取微信用户的openID
  3. linux打开sqlite3数据库,Centos6.5中如何用sqlite3命令打开’.db’后缀的数据库执行sql...
  4. BZOJ 2959 长跑 (LCT、并查集)
  5. 主机和虚拟机ping不通的原因
  6. datagrid如何获取一行数据中的某个字段值_MySQL 如何查找删除重复行?
  7. 【写作】Texlive和Texmaker学习
  8. (转)ASP.NET MVC3默认提供了11种ActionResult的实现
  9. 深圳市南山区学计算机的视频课程,新手学电脑全套视频教程(1-27集)
  10. 配置OpenShift 4 单机版环境 - CodeReady Container
  11. 国内可以使用的英文搜索引擎
  12. 利用Drawable生成圆形图片
  13. hic-pro运行报错Makefile执行过程中出错:make: *** No rule to make target ` ‘Stop
  14. 2020研究洞察:新消费品牌的8大增长驱动力
  15. (新版)SJTU-OJ-1011. John and Cows
  16. python3中使用ADFtest
  17. MiKTeX手动更新宏包超详细,东北大学编译原理第三次作业
  18. 【汽车安全】ISO26262概要
  19. JSM-ActiveMQ
  20. linux gitlab安装教程,linux安装gitlab(官方)

热门文章

  1. 前端开发周边(js版页内锚点跳转方法)
  2. [deviceone开发]-do_Dialog的基本使用示例
  3. 10分钟教你看懂mongodb的npm包
  4. iOS设计模式 - 备忘录
  5. ABAP-小技巧/知识(1)
  6. 【Android】Touch事件分发
  7. tf.keras遇见的坑:Output tensors to a Model must be the output of a TensorFlow `Layer`
  8. 算法学习:后缀数组(SA)
  9. Spark之数据倾斜 --采样分而治之解决方案
  10. bootstrap validator 出现Maximum call stack size exceeded