如果你经常使用Canvas的draw***方法去绘制一些图像图形,绘制的坐标是从Canvas左上角开始计算的,如果想要把一个图像放到某个位置,直接drawBitmap传递图片左上角的坐标就行了。那drawText就不一样,如果你传递进去字符串,会发现文字的位置和你指定的不一样。

Android的文档也没有仔细说,打开源码一看,又跑到native代码里去执行了。

对于一段文字来说,如果你想把他画到Canvas上,首先你要确定这段文字的范围,即宽度和高度,那么怎么去取这一段的高度呢,如果你在网上搜,会有很多种答案,具体应该用哪一种呢?这要看你到底需要什么样的尺寸了。

Paint.getTextBounds: 当你通过这个方法来获取尺寸的时候,你可以得到能够包裹文字的最小矩形,就是图中红色边框的那部分,你可以得到一个Rect对象,包含这个最小尺寸的几个值。坑其实就在这里:这里的Rect对象坐标并不是以左上角为准的,而是相对于左边中间靠下位置的一个点,就是图中的黄色五角星。而这里水平的Baseline指的是字符串对齐的一条线。既然这样,r.top就是一个负值了,r.bottom会是一个小一点的正值,r.left和r.right在图中画的都很清楚。通过r.width()和r.height()来获取尺寸。

那么文字的偏移就好说了,比如说你要把文字画在Canvas的左上角,坐标是(0,0),但是当你通过:

1 canvas.drawText(“dangwen”,0,0,paint);

来画文字的时候,发现只有文字的下半部分画出来了,因为你传递进去的参数应该是以Baseline为标准的,正确的方法是:

1 canvas.drawText(“dangwen”,-r.left,-r.top,paint);

Paint.getFontMetricsInt(): 当你通过这里方法来获取尺寸的时候,你获取的只是一个垂直方向上的尺寸,这里的ascent代表的是字体的上部,descent代表的是字体的下部,这里需要注意的是这和上面获得的Rect的top和bottom不太一样,他们比比ascent和descent距离稍微小一些,这些具体的高度可能和不同的字体和渲染方式有关系,这里就不深入了 #我是不懂#。

然后如果把文字写入TextView(图中蓝色部分)并且设置TextView的高度和宽度设为wrap_content,那么TextView的高度就正好是FontMetricsInt.top – FontMetricsInt.bottom, 那宽度呢? Paint.measureText()。

Android之DrawText详解相关推荐

  1. Android的DrawText详解

    如果你经常使用Canvas的draw***方法去绘制一些图像图形,绘制的坐标是从Canvas左上角开始计算的,如果想要把一个图像放到某个位置,直接drawBitmap传递图片左上角的坐标就行了.那dr ...

  2. Android 动画框架详解,第 1 部分

    2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...

  3. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  4. 绘制系列(五)-DrawText()详解

    绘制系列(五)-DrawText()详解 文字基础知识 1.setTextAlign() 设置文字对齐方式(起始点相对于文字) canvas.drawText("文字",起始点,p ...

  5. Android Text文字详解

    Android Text文字详解 1.绘制文字 1.1 普通绘写文字 1.2 单独指定每个文字的位置 1.3 沿路径绘写文字 2.字体样式 2.1 Paint相关样式 2.2 Typeface字体样式 ...

  6. Android 动画框架详解

    Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...

  7. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  8. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  9. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

最新文章

  1. 那些年,我们一起刷过的计算机视觉比赛
  2. JavaScript-Array操作
  3. EventLoop 的启动
  4. 天赋差的程序员,难道就只能半途而废吗?
  5. IntelliJ IDEA中打开项目时用 Import Project(导入项目) 和 Open(打开项目) 的区别
  6. PyCharm光标变粗的解决办法
  7. alloca函数的风险_alloca的函数范围中的goto是否有效?
  8. python函数模块_06.Python函数和模块
  9. JAVA EE 6 jar包集合_Java EE6将JSF facelets(xhtml)和ManagedBeans打包成JAR
  10. 【PostgreSQL-9.6.3】表继承
  11. nodejs,webpack安装以及初步运用
  12. VS2015 LNK2001:无法解析的外部符号 debug调试
  13. Linux CentOS 6不能使用yum安装命令
  14. c语言 四层电梯算法,电梯算法c语言
  15. MPC-HC/MPC-BE/LAV Filter等播放器相关
  16. 2016OSC源创会年终盛典-综合技术专场-惠新宸
  17. 让html前端的数字每天自己增加,前端开发神器Emmet,让你的代码输入效率瞬间翻倍...
  18. golang:context介绍
  19. WPS整段缩进(类似代码格式)
  20. vb.net 教程 序

热门文章

  1. 我的C#/.NET学习诀窍——LINQPad
  2. ASP.NET Core 对Controller进行单元测试
  3. Swagger在header中添加token
  4. 基于阿里云日志服务快速打造简版业务监控看板
  5. Blazor带我重玩前端(四)
  6. 【今天下午活动】从 HelloWorld 到 AntDesign,Blazor 将 .NET 带到现代前端圈
  7. gRPC真要取代WebApi了,你还学得过来吗?
  8. .NET 下基于动态代理的 AOP 框架实现揭秘
  9. .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)...
  10. Exceptionless - .Net Core开源日志框架