Android的DrawText,getTextBounds

先介绍一下getTextBounds

转载http://blog.csdn.net/zhou452840622/article/details/51790420

void getTextBounds (String text,

                int start, 
                int end, 
                <a target=_blank target="_blank" href="https://developer.android.com/reference/android/graphics/Rect.html" style="text-decoration: none; color: rgb(3, 155, 229);">Rect</a> bounds)

Return in bounds (allocated by the caller) the smallest rectangle that encloses all of the characters, with an implied origin at (0,0).由调用者返回在边界(分配)的最小矩形包含所有的字符,以隐含原点(0,0)。

tring: String to measure and return its bounds 字符串来衡量并返回它的界限

int: Index of the first char in the string to measure 索引的第一个字符的字符串来衡量

int: 1 past the last char in the string measure 1过去的最后一个字符字符串

Rect: Returns the unioned bounds of all the text. Must be allocated by the caller.返回联合边界的所有文本。必须分配给调用者。


然后在来看drawText

转载http://blog.csdn.net/linghu_java/article/details/46404081

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

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

1408964085_thumb.jpeg

对于一段文字来说,如果你想把他画到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()。


再看看Paint中的measureText()

转载http://blog.csdn.net/lyndsc/article/details/51556508

在使用Canvas绘制文字时,需要得到字符串的长度,Paint类内给了两个方法,measureText(),getTextBound();

可是对于同于字符串两个方法得出来的值有些差别:


getTextBounds() 得到的宽度总是比 measureText() 得到的宽度要小一点。

就查看方法的源码

getTextBounds():


measureText():




额,只能看出两种方法测量的方式不一样,getTextBounds()使用了nativeGetCharArrayBounds();measureText()使用了native_measureText().

然而并不能解决疑问,就上网搜。运气不错,有位大神详细的回答了。

下面贴出重点:

enter image description here

This is font size 60, in red is bounds rectangle, in purple is result of measureText.

It's seen that bounds left part starts some pixels from left, and value of measureText is incremented by this value on both left and right. 




 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值