如果你经常使用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. ASP.NetViewState的实现方案
  2. python合理拆分类别_如何用Python进行词组拆分?
  3. 在Word中插入条形码又一法
  4. android 保活方案_Android 后台保活手段总结 (上篇)
  5. 改开源项目的一些心得
  6. 向.NET Core项目添加EntityFrameworkCore支持
  7. python 正则匹配手机号
  8. php dat文件,window_Win7系统怎么打开Dat文件 Win7系统打开Dat文件的方法,  在电脑中的Dat文件是很常 - phpStudy...
  9. firefox改html内容,Firefox 中的 HTML5 音视频
  10. 【Docker】seaweedfs的搭建与使用
  11. celery报错 NotImplementedError: No result backend is configured
  12. Zxing扫描条形码后得到结果前面多了一个0的问题
  13. 抖音壁纸表情包小程序搭建部署说明、广告分佣规则说明以及迭代新计划
  14. java实习找工作经历
  15. 搭建Android应用程序的服务器
  16. 桌面linux imx6q,SAIL-IMX6Q添加qt桌面应用程序
  17. 1000个瓶子和10只老鼠问题浅解
  18. Win11网络延迟太高怎么办?
  19. 1123求cos(x)的值1108一组整数求平均
  20. 如何正确选择合适自己的英文学习方法和材料?

热门文章

  1. Normalization如何解决梯度消失
  2. Laravel使用swagger PHP生成api接口文档
  3. Android单元测试 Instrumentation
  4. Android扭曲图像(水面落叶壁纸初步实现)
  5. 嵌入式开发要学习哪些知识
  6. 前台、中台、后台,业务中台、技术中台、数据中台、算法中台分别是什么?
  7. 阿里云GPU计算型实例规格族gn6i配置性能详解
  8. 11款当前主流平板芯片横向对比评测
  9. oracle 中此处列不允许,oracle 此地不允许序列
  10. 【springboot连接Tomcat报错】Error parsing HTTP request header Note: further occurrences of HTTP