如果你经常使用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()。

转自 https://blog.csdn.net/linghu_java/article/details/46404081

Paint.getTextBounds相关推荐

  1. 画笔Paint的使用

    //画笔Pain的简单使用 Paint paint = new Paint(); // 设置颜色 paint.setColor(color); // 设置抗锯齿 paint.setAntiAlias( ...

  2. Android自定义View Paint

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/123524086 本文出自[赵彦军的博客] 文章目录 画笔模式 画线条 画圆 画矩形 ...

  3. android 自定义paint,Android中自定义常用的三个对象解析(Paint,Color,Canvas)

    Paint,Color,Canvas Paint:画笔对象,画图用的"笔" Color:颜色,相当于调料 Canvas:画布,现实中的纸板 Paint 画笔 常用的方法就是设置和获 ...

  4. Paint(一):画笔基本使用

    1. 设置获取图形绘制.路径相关的 1.1 设置画笔颜色 1.2 设置透明度 1.3 设置颜色 1.4 设置画笔是否抗锯齿 1.5 设置图像是否使用抖动处理,会使得绘制出来的图片更加平滑和饱满,图像更 ...

  5. 自定义View,和Canvas(画布),Paint(画笔),Path(路径)的用法

    重点 怎么自定义控件,Canvas画布,Paint画笔,Path路径的使用 首先为什么要自定义View: 在Android开发中有很多业务场景,原生的控件是无法满足应用,并且经常也会遇到一个UI在多处 ...

  6. android 画笔设置参数,Android画笔Paint和FontMetrics

    有关自定义控件的许多内容,一直都想抽时间梳理一下,当然了梳理的内容不会很深,都是一些比较常用的类或者方法,主要是为了后续用到时方便查阅与参考. 本文主要整理的是Paint的一些基本使用方法和技巧,其中 ...

  7. android paint设置字体方向,Android paint的drawText() 的正确使用方式

    本帖最后由 文晶 于 2016-8-31 12:35 编辑 前段时间在做打印测试,一般打印都是发送字膜,但是非常麻烦,需要去计算字膜,然后又封装成打印机需要的格式,总之,两个字:麻烦!后来在我苦苦计算 ...

  8. Paint 全面解析

    paint的方法分为两类: 负责图形绘制.路径相关 setStrokeWidth(float width)设置画笔宽度 setStyle(Paint.Style style)设置画笔样式 Style有 ...

  9. android 展开式按钮,Android自定义View实现可展开、会呼吸的按钮

    不专门练习的话,自定义View的知识又忘了许多.正好新项目里有这个需求,就再练习一下,代码已上传:地址 可以修改文本.文字大小.各种颜色: 1.按照国际惯例,就是新建attrs,写各种需要的属性,然后 ...

最新文章

  1. 深挖谷歌 DeepMind 和它背后的技术
  2. jdbc 日期时间相关的类型
  3. C++11 新增关键字decltype学习
  4. Python网络编程(1.利用socket(udp)+网络调试助手,发送数据)
  5. UVa 1609 (博弈) Foul Play
  6. URL转微信可识别的二维码
  7. Quick BI产品核心功能大图(五)移动端:让数据在更多业务场景中流通
  8. mysql 执行计时_ps-top 用于MySQL的数据库top工具
  9. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net
  10. 一个元素的偏移的方法
  11. 御剑情缘gm.php,御剑情缘手工端
  12. matlab生成正弦系数表
  13. php实现简易聊天室
  14. python操作微信电脑版_Python通过微信控制电脑
  15. 搜狗微信的链接并转换成永久链
  16. 再说setlocale——关于区域名称
  17. MySQL使用JDBC高级操作和事务
  18. 百度笔试题面试题总结1
  19. 网络131黄宇倩--第二周作业
  20. vol.138 三周年特辑 · 那些无处安放的敏感词们

热门文章

  1. flowjo汉化版_FlowJo10中文免费版-流式细胞分析软件FlowJo 10下载 附安装教程-下载啦...
  2. 聚名:购买in域名有什么优势呢?
  3. MySQL练习整理(每日习题)
  4. 2021年安全员-B证(安全员)及安全员-B证(安全员)实操考试视频
  5. Appium踩坑总结--解决方法
  6. 数据结构:基本概念【详解】
  7. Unity之生成扫描二维码
  8. 阿里P8架构师耗时三年总结:Java春招高频面试题库
  9. 如何摆脱打工人?注册申请163邮箱?尊享TOM VIP微信办公助手?
  10. Text to SQL 论文汇总(NL2SQL/TableQA)