android 计算字体位置
本篇文章已授权微信公众号 安卓巴士开发者门户 独家发布
老规矩,先上张图
o,这篇好像是分析篇,没有效果图。不管了,位置占着,老规矩不能坏,下面开始正文。
这篇博客会讲得比较杂:
里各种的含义?
如何计算每行文字的长度?
设置:="1"和:="true"有什么区别?
为什么设置:="1"时的跑马灯效果就不能正常工作?
里各种的含义?
虽然我们平时只用显示纯文本数据,但其实支持设置,四周的小图标,以及Span数据比如文本或图片。在里不管是什么控件都是占据一个矩形的空间,各个矩形之间基本都可以设置属性,这样一来就被分成多个矩形区域了,而也提供了获取各种和长度的接口,如下:
(), ()
/Right/Top/()
ft/Right/Top/()
ttom/Top()
/Right/Top/()
先看一下布局代码:
6.png
@/
7.png
下面是效果图,做了一些标注:
8.png
下面来看一下上述获取长度的接口的数据,你可以使用打日志方式,我是比较习惯用调试方式:
9.png
所以,总结一下:
(), ():对应你代码里的和。
/Right/Top/():对应代码里的。
以上两个比较容易理解,毕竟经常打交道。
ft/Top/Right/(): 翻译成中文就是获取混合的, 既然是混合的,那么它的值也就是 + 图片的大小 + 的值。说得通俗点就是,它是获取文字区域到边界之间的间隔。附上源码:
10.png
p():这个是当有部分文字没有显示出来时,也就是设置了时,它的值就等于首行文字到顶端的距离。同理,ttom()就是最后一行文字到底部距离。其他情况下,他的值等于p/()的值。这个源码不多,但也不怎么好讲解,就贴两张图对比下,就明白了。
11.png
12.png
/Right/Top/():翻译下就是获取总的值,看了下源码,左右的值直接就是等于的值,上下的值等于的值再加上的值(跟的垂直方向的布局有关。说得通俗点就是,不管有没有,上下的值都分别等于首行到顶端和末行到底部的值。
这些接口除了前面两个比较常用外,其他基本很少用吧,我也是因为在看的跑马灯部分的源码才接触到,然后为了弄明白才记录下来的。至于后面那些接口的应用场景,()这个的应用场景倒是很明确,可以用来判断相应的是否发生点击事件之类的需求。至于和这两个的应用场景,我想了想,觉得应该是涉及需要计算显示出来后的文字高度的相关需求时会用到吧。有对这些接口很熟悉的童鞋可以分享出来哈,一起学习学习。
最后用一张图总结一下,我把分成内容区域,内容区域和边界之间的间隔就是的值,内容区域包括区域和文字区域,区域和文字区域之间的间隔就是的值,文字区域和之间的间隔就是的值。
13.png
如何计算每行文字的长度?
Q:每行文字的长度不就等于的宽度吗?直接()不就好了?
A:再看一下上面那部分内容你就清楚了,只有当宽度设置为,且没有背景图或时,文字的长度才等于();当文字很少,没有填充满时,或是溢出时,文字的长度都得另外计算。
Q:每行文字的长度不一样长吗?
A:因为有自己的换行策略,如下图所示,显然每行的文字长度不一样长。
14.png
Q:文字的长度是指哪段长度?
A:看需求吧,我觉得通常情况下都是只需要计算显示在屏幕上的可见区域的每行文字的长度即可。还有那么一种需求,当设置了溢出内容用...表示时,那么其实每行文字的实际长度就不止可见区域那么长了。
那么该如何计算文字的长度呢?单单根据上一部分里的各种值肯定不够,根据各种顶多计算出文字区域的宽度,但实际上每一行文字并不会那么刚刚好占满文字区域的宽度,那么就还得借助其他来进行计算。
方法1:.().( text)
15.png
但这种方法只是测试传入的text在该的配置下的总长度,并不是计算每一行的长度。
方法2:.().(int line)
16.png
对应的是图14,正好,利用方法1验证一下,这个方法计算得到的是不是每行文字的长度。
17.png
完全正确,所以说这个方法确实计算得到的是每一行文字的实际长度,注意这里是实际长度,也就是说当设置属性时,用这个方法测量得到的是一整行文字的长度,包括溢出部分。
设置:="1"和:="true"有什么区别?
官方是推荐说不要再使用,用="1"代替。但其实这两个的效果是不一样的,官方api接口里有说明,都是英文我就不贴图了,大概翻译下:
:限制的最高高度,大概就是指通过限制行数来限制最高高度。
: 强制设置的文字不换行。
区别就是:还是会默认自动进行换行策略,假如一段文字自动换行后有5行,设置为1,那么就只显示第一行的内容,其他行不显示。
但是,如果是设置了, 那么这段可以有5行的文字将会被强制放在1行里,然后看最多能显示多少字符,剩下的不显示。
这样的区别就是导致了很多人在使用的跑马灯效果时不能正常工作的状态,所以下面单独列出个问题来讲。
为什么设置:="1"时的跑马灯效果就不能正常工作?
明白了="1"和的区别后,只要再明白跑马灯的原理,就很容易理解为什么设置成="1"时跑马灯不工作了。我在上一篇博客里写过跑马灯启动的条件,具体的分析可以去上一篇看,这里大概说下。
跑马灯要启动要同时满足四个条件,其中有一个条件就是这一行的文字长度要大于文字区域的宽度,文字区域的宽度就是的()扣去再扣去剩下的长度。
如果是="1"的话,那么就像上一问中分析的那样,所有的文字其实已经被自动换行了,只显示第一行,而换行是什么,就是为了让每行文字的长度超过文字区域的宽度才进行的换行,也就是说,如果一段文字经过的换行后,那么每行的文字长度都不会超过文字区域的长度。这样一来,自然就不满足跑马灯的启动条件之一了,跑马灯也就不能正常工作了。
的话,则是不会对一段文字进行换行处理,这样一来,自然就超过了文字区域的长度,所以如果要设置跑马灯效果的话,只能用不能用="1"。
QQ图片223.jpg
最近刚开通了公众号,想激励自己坚持写作下去,初期主要分享原创的或-Tv方面的小知识,感兴趣的可以点一波关注,谢谢支持~~