Android的DrawText详解
如果你经常使用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详解相关推荐
- Android之DrawText详解
如果你经常使用Canvas的draw***方法去绘制一些图像图形,绘制的坐标是从Canvas左上角开始计算的,如果想要把一个图像放到某个位置,直接drawBitmap传递图片左上角的坐标就行了.那dr ...
- Android 动画框架详解,第 1 部分
2019独角兽企业重金招聘Python工程师标准>>> Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框 ...
- Android之canvas详解
首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...
- 绘制系列(五)-DrawText()详解
绘制系列(五)-DrawText()详解 文字基础知识 1.setTextAlign() 设置文字对齐方式(起始点相对于文字) canvas.drawText("文字",起始点,p ...
- Android Text文字详解
Android Text文字详解 1.绘制文字 1.1 普通绘写文字 1.2 单独指定每个文字的位置 1.3 沿路径绘写文字 2.字体样式 2.1 Paint相关样式 2.2 Typeface字体样式 ...
- Android 动画框架详解
Android 动画框架详解 基本原理 朱 韦伟, 软件工程师, IBM 李 浩, 软件工程师, 爱格码 简介: Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果.A ...
- 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...
本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...
- JMessage Android 端开发详解
JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...
- 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格
本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...
最新文章
- ASP.NetViewState的实现方案
- python合理拆分类别_如何用Python进行词组拆分?
- 在Word中插入条形码又一法
- android 保活方案_Android 后台保活手段总结 (上篇)
- 改开源项目的一些心得
- 向.NET Core项目添加EntityFrameworkCore支持
- python 正则匹配手机号
- php dat文件,window_Win7系统怎么打开Dat文件 Win7系统打开Dat文件的方法, 在电脑中的Dat文件是很常 - phpStudy...
- firefox改html内容,Firefox 中的 HTML5 音视频
- 【Docker】seaweedfs的搭建与使用
- celery报错 NotImplementedError: No result backend is configured
- Zxing扫描条形码后得到结果前面多了一个0的问题
- 抖音壁纸表情包小程序搭建部署说明、广告分佣规则说明以及迭代新计划
- java实习找工作经历
- 搭建Android应用程序的服务器
- 桌面linux imx6q,SAIL-IMX6Q添加qt桌面应用程序
- 1000个瓶子和10只老鼠问题浅解
- Win11网络延迟太高怎么办?
- 1123求cos(x)的值1108一组整数求平均
- 如何正确选择合适自己的英文学习方法和材料?
热门文章
- Normalization如何解决梯度消失
- Laravel使用swagger PHP生成api接口文档
- Android单元测试 Instrumentation
- Android扭曲图像(水面落叶壁纸初步实现)
- 嵌入式开发要学习哪些知识
- 前台、中台、后台,业务中台、技术中台、数据中台、算法中台分别是什么?
- 阿里云GPU计算型实例规格族gn6i配置性能详解
- 11款当前主流平板芯片横向对比评测
- oracle 中此处列不允许,oracle 此地不允许序列
- 【springboot连接Tomcat报错】Error parsing HTTP request header Note: further occurrences of HTTP