如何“任性”使用Android的drawText()
Android的canvas上可以画很多基本形状,诸如:圆,矩形,线条等等,其中当属文字即drawText()较难理解和使用(额,这只是就个人感受),下面将慢慢介绍下如何简单使用drawText()。
FontMetrics
FontMetrics是Paint的一个内部类,主要定义了Paint绘图时的一些关键坐标位置,具体如下图(1)所示:
图(1):

其中:
ascent:该距离是从所绘字符的baseline之上至该字符所绘制的最高点。这个距离是系统推荐。
descent:该距离是从所绘字符的baseline之下至该字符所绘制的最低点。这个距离是系统推荐的。
top:该距离是从所绘字符的baseline之上至可绘制区域的最高点。
bottom:该距离是从所绘字符的baseline之下至可绘制区域的最低点。
leading:为文本的线之间添加额外的空间,这是官方文档直译,debug时发现一般都为0.0,该值也是系统推荐的。
特别注意: ascent和top都是负值,而descent和bottom:都是正值。
drawText()参数
理解好一个函数所需参数的具体含义,是用好一个函数的关键。canvas.drawText(String text, float x, float y, Paint paint)中有四个参数,这四个参数都是表示其相对于所在View中的坐标,和屏幕坐标无关。其中text和paint较容易理解,下面重点介绍x和y的具体含义。
float x:根据官方API上的解释,该参数表示text被画的起始x坐标。其实text被画的起始位置还与Paint有关,Paint的TextAlign属性决定了text相对于起始坐标x的相对位置。例如,TextAlign的默认属性为Paint.Align.LEFT,这是text就是从起始坐标x的右侧开始画起。
图(2):

图(3):

float y: 根据官方API上的解释,该参数表示text被画的起始y坐标。这个解释是比较抽象的,其实起始y坐标所代表是text的baseline在Y轴方向的位置。
drawText()居中显示
推导前提:Paint的TextAlign属性值为Paint.Align.LEFT,即为默认属性。
然后根据上面的参数介绍,drawText()的水平起始坐标x很容易确定。
float x = getWidht() >> 1 - paint.measureText(String text) >> 1
比较棘手的是drawText()的垂直起始坐标y,即baseline到底怎么确定。其实我们可以由上图(1)中各基准线间的相对位置关系推算出来。
假设我们所求的baseline的值为baseY;
text的bottom距离:
①bottomY = baseY + fontMetrics.bottom;
text的字体高度:
②fontHeight = fontMetrics.descent- fontMetrics.ascent
因为我们要让text垂直居中,所以此时text的bottom距离应该为:
③bottomY=1/2 * height + 1/2 * fontHeight所以由上述①②③公式就可以推得:④baseY = 1/2 * height + 1/2 * (fontMetrics.descent- fontMetrics.ascent) - fontmetrics.bottom
此时求得baseline的值,即cavans.drawText()里的y的坐标。
推论:任意位置
其实由上述公式④可知,在paint的size属性不变情况下,只有height是变量,所以控制好height的值就可以把drawText()画在View的任意的位置,公式就大家自己推导下把,我就不累述了。
公式修正
感谢POP网友指出错误,正确的公式应为:
text的descent距离:
①descentY = baseY + fontMetrics.descent;
text的字体高度:
②fontHeight = fontMetrics.descent- fontMetrics.ascent
因为我们要让text垂直居中,所以此时text的bottom距离应该为:
③descentY=1/2 * height + 1/2 * fontHeight所以由上述①②③公式就可以推得:④baseY = 1/2 * height - 1/2 * ( fontMetrics.ascent + fontMetrics.descent )
此时求得baseline的值,即cavans.drawText()里的y的坐标。
作者:XycZero
查看原文:http://www.xyczero.com/blog/article/20/.
如何“任性”使用Android的drawText()的更多相关文章
- Android Canvas drawText实现中文垂直居中
目标: 把中文字符绘制到目标矩形的居中位置. 问题: Android的Canvas绘图,drawText里的origin是以baseline为基准的,直接以目标矩形的bottom传进drawText, ...
- android开发 drawtext的开始坐标位置
我们canvas绘制文字的遇到一个不知道drawtext(str,x,y,paint) 中的x.y坐标值怎么定义,,如果设为(0,0)的话文字就不会出来了.因此查找到一下资料: 问:canvas.d ...
- 关于Android Canvas.drawText方法中的坐标参数的正确解释
canvas.drawText("www.jcodecraeer.com", x, y, paint); x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题的直观印象 ...
- Android Canvas.drawText方法中的坐标参数的正确解释
摘要 canvas.drawText(www.jcodecraeer.com, x, y, paint); x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题的直观印象应该是左上角的坐标, ...
- android Canvas drawText 文字居中
1首先利用canvas获取画布的宽高, //获取屏幕的宽和高int width = canvas.getWidth();int height = canvas.getHeight(); 2获取文字的宽 ...
- android canvas drawtext 字高
Paint pFont = new Paint(); Rect rect = new Rect(); pFont.getTextBounds("豆", 0, 1, rect); L ...
- Android drawText 做到文字绝对居中
我们在android中经常会遇到自定义一些组件,因为现有的android组件是往往不能满足当下的需求的,今天就给大家介绍一下在自定义组建过程中用到的drawText不居中的问题的解决方案 首先大家看一 ...
- Cavace 自定义View绘制
一.开发资料与实例教程1.跟囧猫学之Canvas.Matrix 倒影实例教程 http://www.eoeandroid.com/thread-158506-1-1.html 2.Gridview 控 ...
- android中画文字的换行 办法(对于遇到canvas.drawText(String s )无法实现换行问题的解决)
在使用canvas.drawText()绘制文字的时候,发现,如果需要绘制的文字较长,需要换行,通过在文字中加上“\n"或者”\r\n"都无法实现换行,如果非要使用canvas.d ...
随机推荐
- 用函数生成select选择框
// 生成 html select option 标签 function build_options($options, $opt='',$k='') { $frags = array(); if ( ...
- sqlserver 遇到以零作除数错误的处理 不报错的解决方法
使用sqlserver 的选项来禁止出现以零除的错误中断,让而让其为null set ansi_warnings offSET ARITHABORT offSET ARITHIGNORE on sel ...
- 【设计模式 - 12】之代理模式(Proxy)
1 模式简介 1.1 定义 为其他对象提供一种代理以控制对这个对象的访问.代理对象起到中介作用,可以去掉功能服务或增加额外服务. 1.2 常见的代理模式 1) 远程 ...
- cocos2d-x创建精灵动画
创建动画一般过程: 1.创建精灵框架缓存,并向其中添加相应的动画文件(plist),最后,通过动画集缓存生产动画 CCSpriteFrameCache *cache = CCSpriteFrameCa ...
- TREEVIEW节点拖拽
http://files.cnblogs.com/xe2011/TreeView_Drag_and_Drop.rar 假设把A节点往B节点上拖拽 那么 A 为Node1,B为Node2 ...
- Spring DI模式 小样例
今儿跟同事讨论起来spring早期的,通过大篇幅xml的配置演变到今天annotation的过程,然后随手写了个小样例,感觉还不错,贴到这里留个纪念. 样例就是用JAVA API的方式, ...
- eclipse删除空行
1.打开源码编辑器 2.使用快捷键Ctrl+f 3.在Find输入框中输入:^\s*\n 4.Replace With输入框的值为空 5.在[Options]选中的"Regular expr ...
- java获取计算机硬件参数
public class HardWareUtils { /** * * 获取主板序列号 * * * * @return */ public static String g ...
- 关于echarts的使用----模块化单文件引入(推荐) 与标签式单文件引入
官网:http://echarts.baidu.com/echarts2/doc/doc.html#引入ECharts3 关于模块化单文件引入(推荐) 与标签式单文件引入
- URAL 2032 - Conspiracy Theory and Rebranding【本源勾股数组】
[题意] 给出三角形的三个边长,均是10^7以内的整数,问三角形的三个角的坐标是否能均是整数,输出其中任意一个解. [题解] 一开始想的是枚举一条边的横坐标,然后通过勾股定理以及算角度求出其他点的坐标 ...